Auto joins channels when invited.
Author: xt
— Version: 0.9
— License: GPL-3.0-or-later
For WeeChat ≥ 0.3.0.
Tags: irc, invite, autojoin, py2, py3
Added: 2009-10-28
— Updated: 2022-10-25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | # -*- coding: utf-8 -*- # # Copyright (c) 2009 by xt <xt@bash.no> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # # (this script requires WeeChat 0.3.0 or newer) # # History: # 2022-10-19, Guillermo Castro <github@codegeek.dev> # version 0.9: fix regex parsing of INVITE to allow non-ircv3 matching # 2022-03-2, h-0-s-h <noreply@ic3.gov> # version 0.8: fix reged parsing of INVITE message to account for ircv3/CAPS style/etc # (@time=2022-03-02T19:00:30.041Z :XXXXX!~XXXXX@xxxxx INVITE h-0-s-h :#xxxxx) # 2018-10-03, Pol Van Aubel <dev@polvanaubel.com> # version 0.7: Python3 compatibility. Considerations: # - Settings during registration are iterated over only once, so # code should be succinct rather than efficient on both Py2/3. # - The autojoin_keys zip is turned into a dict, so wouldn't # make sense to first turn into a list as futurize suggests. # 2015-10-11, Simmo Saan <simmo.saan@gmail.com> # version 0.6: allow joining channels with keys in autojoin # 2013-12-21, Sebastien Helleu <flashcode@flashtux.org> # version 0.5: fix parsing of INVITE message # 2013-11-28, sakkemo <scajanus@gmail.com> # version 0.4: add whitelist for nicks/channels # 2009-11-09, xt <xt@bash.no> # version 0.3: add ignore option for channels # 2009-10-29, xt <xt@bash.no> # version 0.2: add ignore option # 2009-10-28, xt <xt@bash.no> # version 0.1: initial release import weechat as w import re SCRIPT_NAME = "autojoin_on_invite" SCRIPT_AUTHOR = "xt <xt@bash.no>" SCRIPT_VERSION = "0.9" SCRIPT_LICENSE = "GPL3" SCRIPT_DESC = "Auto joins channels when invited" # script options settings = { 'whitelist_nicks': '', # comma separated list of nicks, # overrides ignore_nicks 'whitelist_channels': '', # comma separated list of channels, # overrides ignore_channels 'ignore_nicks': '', # comma separated list of nicks #that we will not accept auto invite from 'ignore_channels': '', # comma separated list of channels to not join 'autojoin_key': 'on', # use channel keys from server's autojoin list } if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, "", ""): for option, default_value in settings.items(): if not w.config_is_set_plugin(option): w.config_set_plugin(option, default_value) w.hook_signal('*,irc_in2_invite', 'invite_cb', '') def join(server, channel): key = None if w.config_string_to_boolean(w.config_get_plugin('autojoin_key')): autojoin = w.config_string(w.config_get('irc.server.%s.autojoin' % server)).split(' ', 1) if len(autojoin) > 1: # any keys specified autojoin_keys = dict(zip(autojoin[0].split(','), autojoin[1].split(','))) key = autojoin_keys.get(channel) # defaults to None when not set if key: w.command('', '/quote -server %s JOIN %s %s' % (server, channel, key)) else: w.command('', '/quote -server %s JOIN %s' % (server, channel)) def invite_cb(data, signal, signal_data): server = signal.split(',')[0] # EFNet,irc_in_INVITE channel = signal_data.split()[-1].lstrip(':') # :nick!ident@host.name INVITE yournick :#channel from_nick = '' SearchStr = '(?:\@.*)?:(?P<nick>.+)!' #@time=2022-03-02T19:00:30.041Z :XX-XXXX!~XX-XXXX@xx.xxxx INVITE yournick :#xxxx-xxx (works also when no message-tag is present) from_nick = re.search(SearchStr, signal_data).groups()[0] if len(w.config_get_plugin('whitelist_nicks')) > 0 and len(w.config_get_plugin('whitelist_channels')) > 0: # if there's two whitelists, accept both if from_nick in w.config_get_plugin('whitelist_nicks').split(',') or channel in w.config_get_plugin('whitelist_channels').split(','): w.prnt('', 'Automatically joining %s on server %s, invitation from %s (whitelist).' \ %(channel, server, from_nick)) join(server, channel) else: w.prnt('', 'Ignoring invite from %s to channel %s. Neither inviter nor channel in whitelist.' %(from_nick, channel)) elif len(w.config_get_plugin('whitelist_nicks')) > 0: # if there's a whitelist, accept nicks in it if from_nick in w.config_get_plugin('whitelist_nicks').split(','): w.prnt('', 'Automatically joining %s on server %s, invitation from %s (whitelist).' \ %(channel, server, from_nick)) join(server, channel) else: w.prnt('', 'Ignoring invite from %s to channel %s. Inviter not in whitelist.' %(from_nick, channel)) elif len(w.config_get_plugin('whitelist_channels')) > 0: # if there's a whitelist, accept channels in it if channel in w.config_get_plugin('whitelist_channels').split(','): w.prnt('', 'Automatically joining %s on server %s, invitation from %s (whitelist).' \ %(channel, server, from_nick)) join(server, channel) else: w.prnt('', 'Ignoring invite from %s to channel %s. Channel not in whitelist.' %(from_nick, channel)) else: # use the ignore lists to make the decision if from_nick in w.config_get_plugin('ignore_nicks').split(','): w.prnt('', 'Ignoring invite from %s to channel %s. Invite from ignored inviter.' %(from_nick, channel)) elif channel in w.config_get_plugin('ignore_channels').split(','): w.prnt('', 'Ignoring invite from %s to channel %s. Invite to ignored channel.' %(from_nick, channel)) else: w.prnt('', 'Automatically joining %s on server %s, invitation from %s.' \ %(channel, server, from_nick)) join(server, channel) return w.WEECHAT_RC_OK |