Skip to content

Commit a4527ac

Browse files
committed
Handle channel keys in client config
1 parent 96d4ae1 commit a4527ac

File tree

2 files changed

+89
-46
lines changed

2 files changed

+89
-46
lines changed

plugins/core/core_misc.py

Lines changed: 67 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,106 +10,117 @@
1010

1111

1212
# Auto-join on Invite (Configurable, defaults to True)
13-
@hook.irc_raw('INVITE')
13+
@hook.irc_raw("INVITE")
1414
async def invite(irc_paramlist, conn):
1515
"""
1616
:type irc_paramlist: list[str]
1717
:type conn: cloudbot.client.Client
1818
"""
19-
invite_join = conn.config.get('invite_join', True)
19+
invite_join = conn.config.get("invite_join", True)
2020
chan = irc_paramlist[-1]
2121

2222
if invite_join:
2323
conn.join(chan)
2424

2525

26-
@hook.irc_raw('JOIN')
26+
@hook.irc_raw("JOIN")
2727
def on_join(chan, conn, nick):
2828
if conn.nick.casefold() == nick.casefold():
2929
conn.cmd("MODE", chan)
3030

3131

32-
@hook.irc_raw('324')
32+
@hook.irc_raw("324")
3333
def check_mode(irc_paramlist, conn, message):
3434
# message(", ".join(irc_paramlist), "bloodygonzo")
3535
mode = irc_paramlist[2]
36-
require_reg = conn.config.get('require_registered_channels', False)
36+
require_reg = conn.config.get("require_registered_channels", False)
3737
if "r" not in mode and require_reg:
3838
message("I do not stay in unregistered channels", irc_paramlist[1])
3939
conn.part(irc_paramlist[1])
4040

4141

42-
@hook.irc_raw('MODE')
42+
@hook.irc_raw("MODE")
4343
def on_mode_change(conn, irc_paramlist, message):
44-
require_reg = conn.config.get('require_registered_channels', False)
44+
require_reg = conn.config.get("require_registered_channels", False)
4545
chan = irc_paramlist[0]
4646
modes = irc_paramlist[1]
4747
new_modes = {}
4848
adding = True
4949
for c in modes:
50-
if c == '+':
50+
if c == "+":
5151
adding = True
52-
elif c == '-':
52+
elif c == "-":
5353
adding = False
5454
else:
5555
new_modes[c] = adding
5656

57-
if chan[0] == '#' and require_reg and not new_modes.get("r", True):
57+
if chan[0] == "#" and require_reg and not new_modes.get("r", True):
5858
message("I do not stay in unregistered channels", chan)
5959
conn.part(chan)
6060

6161

6262
# Identify to NickServ (or other service)
63-
@hook.irc_raw('004')
63+
@hook.irc_raw("004")
6464
async def onjoin(conn, bot):
6565
"""
6666
:type conn: cloudbot.clients.clients.IrcClient
6767
:type bot: cloudbot.bot.CloudBot
6868
"""
6969
logger.info("[%s|misc] Bot is sending join commands for network.", conn.name)
70-
nickserv = conn.config.get('nickserv')
70+
nickserv = conn.config.get("nickserv")
7171
if nickserv and nickserv.get("enabled", True):
7272
logger.info("[%s|misc] Bot is authenticating with NickServ.", conn.name)
73-
nickserv_password = nickserv.get('nickserv_password', '')
74-
nickserv_name = nickserv.get('nickserv_name', 'nickserv')
75-
nickserv_account_name = nickserv.get('nickserv_user', '')
76-
nickserv_command = nickserv.get('nickserv_command', 'IDENTIFY')
73+
nickserv_password = nickserv.get("nickserv_password", "")
74+
nickserv_name = nickserv.get("nickserv_name", "nickserv")
75+
nickserv_account_name = nickserv.get("nickserv_user", "")
76+
nickserv_command = nickserv.get("nickserv_command", "IDENTIFY")
7777
if nickserv_password:
78-
if "censored_strings" in bot.config and nickserv_password in bot.config['censored_strings']:
79-
bot.config['censored_strings'].remove(nickserv_password)
78+
if (
79+
"censored_strings" in bot.config
80+
and nickserv_password in bot.config["censored_strings"]
81+
):
82+
bot.config["censored_strings"].remove(nickserv_password)
8083
if nickserv_account_name:
81-
conn.message(nickserv_name, "{} {} {}".format(nickserv_command,
82-
nickserv_account_name, nickserv_password))
84+
conn.message(
85+
nickserv_name,
86+
"{} {} {}".format(
87+
nickserv_command, nickserv_account_name, nickserv_password
88+
),
89+
)
8390
else:
84-
conn.message(nickserv_name, "{} {}".format(nickserv_command, nickserv_password))
91+
conn.message(
92+
nickserv_name, "{} {}".format(nickserv_command, nickserv_password)
93+
)
8594
if "censored_strings" in bot.config:
86-
bot.config['censored_strings'].append(nickserv_password)
95+
bot.config["censored_strings"].append(nickserv_password)
8796
await asyncio.sleep(1)
8897

8998
# Should we oper up?
90-
oper_pw = conn.config.get('oper_pw', False)
91-
oper_user = conn.config.get('oper_user', False)
99+
oper_pw = conn.config.get("oper_pw", False)
100+
oper_user = conn.config.get("oper_user", False)
92101
if oper_pw and oper_user:
93102
out = "OPER {} {}".format(oper_user, oper_pw)
94103
conn.send(out)
95104
# Make sure we finish oper-ing before continuing
96105
await asyncio.sleep(1)
97106

98107
# Set bot modes
99-
mode = conn.config.get('mode')
108+
mode = conn.config.get("mode")
100109
if mode:
101110
logger.info("[%s|misc] Bot is setting mode on itself: %s", conn.name, mode)
102-
conn.cmd('MODE', conn.nick, mode)
111+
conn.cmd("MODE", conn.nick, mode)
103112

104-
log_chan = conn.config.get('log_channel')
113+
log_chan = conn.config.get("log_channel")
105114
if log_chan:
106115
conn.join(log_chan)
107116

108117
conn.ready = True
109-
logger.info("[%s|misc] Bot has finished sending join commands for network.", conn.name)
118+
logger.info(
119+
"[%s|misc] Bot has finished sending join commands for network.", conn.name
120+
)
110121

111122

112-
@hook.irc_raw('376')
123+
@hook.irc_raw("376")
113124
async def do_joins(conn):
114125
"""
115126
Join config defined channels
@@ -122,34 +133,51 @@ async def do_joins(conn):
122133
chans = copy(conn.config_channels)
123134

124135
# Join config-defined channels
125-
join_throttle = conn.config.get('join_throttle', 0.4)
136+
join_throttle = conn.config.get("join_throttle", 0.4)
126137
logger.info("[%s|misc] Bot is joining channels for network.", conn.name)
127138
for channel in chans:
128-
conn.join(channel)
139+
if isinstance(channel, dict):
140+
chan = channel["name"]
141+
key = channel.get("key")
142+
elif isinstance(channel, list):
143+
chan = channel[0]
144+
if len(channel) > 1:
145+
key = channel[1]
146+
else:
147+
key = None
148+
elif " " in channel:
149+
chan, key = channel.split(None, 1)
150+
else:
151+
chan = channel
152+
key = None
153+
154+
conn.join(chan, key)
129155
await asyncio.sleep(join_throttle)
130156

131157

132-
@hook.irc_raw('004')
158+
@hook.irc_raw("004")
133159
async def keep_alive(conn):
134160
"""
135161
:type conn: cloudbot.clients.clients.IrcClient
136162
"""
137-
keepalive = conn.config.get('keep_alive', False)
163+
keepalive = conn.config.get("keep_alive", False)
138164
if keepalive:
139165
while True:
140-
conn.cmd('PING', conn.nick)
166+
conn.cmd("PING", conn.nick)
141167
await asyncio.sleep(60)
142168

143169

144-
@hook.irc_raw('433')
170+
@hook.irc_raw("433")
145171
def on_nick_in_use(conn, irc_paramlist):
146-
conn.nick = irc_paramlist[1] + '_'
172+
conn.nick = irc_paramlist[1] + "_"
147173
conn.cmd("NICK", conn.nick)
148174

149175

150-
@hook.irc_raw('432', singlethread=True)
176+
@hook.irc_raw("432", singlethread=True)
151177
async def on_invalid_nick(conn):
152-
nick = conn.config['nick']
178+
nick = conn.config["nick"]
153179
conn.nick = nick
154180
conn.cmd("NICK", conn.nick)
155-
await asyncio.sleep(30) # Just in case, we make sure to wait at least 30 seconds between sending this
181+
await asyncio.sleep(
182+
30
183+
) # Just in case, we make sure to wait at least 30 seconds between sending this

tests/plugin_tests/test_core_misc.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import asyncio
2-
from unittest.mock import MagicMock
2+
from unittest.mock import MagicMock, call
33

44
import pytest
55

@@ -14,20 +14,35 @@ class Bot(MagicMock):
1414

1515
class MockClient(Client): # pylint: disable=abstract-method
1616
def __init__(self, bot, *args, **kwargs):
17-
super().__init__(bot, 'TestClient', *args, **kwargs)
17+
super().__init__(bot, "TestClient", *args, **kwargs)
1818
self.active = True
19-
20-
join = MagicMock()
19+
self.join = MagicMock()
2120

2221

2322
async def test_do_joins():
2423
client = MockClient(
25-
Bot(), 'foo', 'foobot', channels=['#foo']
24+
Bot(),
25+
"foo",
26+
"foobot",
27+
channels=[
28+
"#foo",
29+
"#bar key",
30+
["#baz", "key1"],
31+
{"name": "#chan"},
32+
{"name": "#chan1", "key": "key2"},
33+
],
2634
)
2735
from plugins.core import core_misc
36+
2837
client.ready = True
29-
client.config['join_throttle'] = 0
38+
client.config["join_throttle"] = 0
3039

3140
await core_misc.do_joins(client)
3241

33-
client.join.assert_called_once_with('#foo')
42+
assert client.join.mock_calls == [
43+
call("#foo", None),
44+
call("#bar", "key"),
45+
call("#baz", "key1"),
46+
call("#chan", None),
47+
call("#chan1", "key2"),
48+
]

0 commit comments

Comments
 (0)