Script: autojoin_on_invite.py

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

Download GitHub Repository

  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