|
1 |
| -from motobot import hook, sink, request, Priority |
2 |
| - |
3 |
| - |
4 |
| -def get_master_lists(bot, session): |
5 |
| - confirmed, unconfirmed = session.get((set(), None)) |
6 |
| - |
7 |
| - if unconfirmed is None: |
8 |
| - unconfirmed = set(map(str.lower, bot.masters)) |
9 |
| - session.set((confirmed, unconfirmed)) |
10 |
| - |
11 |
| - return confirmed, unconfirmed |
| 1 | +from motobot import hook, request, command, BotError, Notice, hostmask_check, Priority, IRCLevel, split_response |
12 | 2 |
|
13 | 3 |
|
14 | 4 | @request('IS_MASTER')
|
15 |
| -def is_master_request(bot, context, nick): |
16 |
| - confirmed = get_master_lists(bot, context.session)[0] |
17 |
| - return nick.lower() in confirmed |
18 |
| - |
| 5 | +def is_master_request(bot, context, nick, host=None): |
| 6 | + recognised = context.session.get(set()) |
| 7 | + admin_masks = context.database.get([]) |
| 8 | + return nick.lower() in recognised or \ |
| 9 | + any(hostmask_check(nick, host, mask) for mask in admin_masks) |
19 | 10 |
|
20 |
| -def check(bot, session, nick): |
21 |
| - """ Check a user by sending a WHOIS query. """ |
22 |
| - confirmed, unconfirmed = get_master_lists(bot, session) |
23 |
| - |
24 |
| - if nick.lower() in unconfirmed: |
25 |
| - bot.send('WHOIS ' + nick) |
26 |
| - |
27 |
| - |
28 |
| -def verify(bot, session, nick): |
29 |
| - """ Mark a master as verified in the bot. """ |
30 |
| - nick = nick.lower() |
31 |
| - confirmed, unconfirmed = get_master_lists(bot, session) |
32 | 11 |
|
| 12 | +@command('identify', hidden=True, priority=Priority.max) |
| 13 | +def identify_command(bot, context, message, args): |
33 | 14 | try:
|
34 |
| - unconfirmed.remove(nick) |
35 |
| - confirmed.add(nick) |
36 |
| - except KeyError: |
37 |
| - pass |
| 15 | + password = bot.admin_pass |
| 16 | + except AttributeError: |
| 17 | + raise BotError("Error: I've not been configured with a password.", Notice(context.nick)) |
38 | 18 |
|
| 19 | + input_pass = ' '.join(args[1:]) |
| 20 | + if input_pass == password: |
| 21 | + recognise(context.session, context.nick) |
| 22 | + response = 'You are now recognised as a bot admin.' |
| 23 | + else: |
| 24 | + response = 'Error: Password incorrect.' |
| 25 | + return response, Notice(context.nick) |
39 | 26 |
|
40 |
| -def unverify(bot, session, nick): |
41 |
| - """ Unmark a user as verified in the bot. """ |
42 |
| - nick = nick.lower() |
43 |
| - confirmed, unconfirmed = get_master_lists(bot, session) |
44 |
| - |
45 |
| - try: |
46 |
| - confirmed.remove(nick) |
47 |
| - unconfirmed.add(nick) |
48 |
| - except KeyError: |
49 |
| - pass |
50 | 27 |
|
| 28 | +def recognise(session, nick): |
| 29 | + admins = session.get(set()) |
| 30 | + admins.add(nick.lower()) |
| 31 | + session.set(admins) |
51 | 32 |
|
52 |
| -@hook('307') |
53 |
| -def registered_nick_confirm_rizon(bot, context, message): |
54 |
| - """ Hooks the user is registered reply from a WHOIS query and verifies user. """ |
55 |
| - verify(bot, context.session, message.params[1]) |
56 | 33 |
|
57 |
| - |
58 |
| -@hook('330') |
59 |
| -def registered_nick_confirm_freenode(bot, context, message): |
60 |
| - """ Hooks the user is registered reply from a WHOIS query and verifies user. """ |
61 |
| - if message.params[1] == message.params[2]: |
62 |
| - verify(bot, context.session, message.params[2]) |
63 |
| - |
64 |
| - |
65 |
| -@sink(priority=Priority.max) |
66 |
| -def master_verification_sink(bot, context, message): |
67 |
| - """ Checks a user that speaks in the channel. """ |
68 |
| - check(bot, context.session, context.nick) |
69 |
| - |
70 |
| - |
71 |
| -@hook('353') |
72 |
| -def handle_names(bot, context, message): |
73 |
| - """ Check users whom are present in the channel upon joining. """ |
74 |
| - names = message.params[-1].split(' ') |
75 |
| - for name in names: |
76 |
| - check(bot, context.session, name.lstrip('+%@&~')) |
77 |
| - |
78 |
| - |
79 |
| -@hook('JOIN') |
80 |
| -def handle_join(bot, context, message): |
81 |
| - """ Check a user that joins a channel. """ |
82 |
| - check(bot, context.session, message.nick) |
| 34 | +@command('adminmask', level=IRCLevel.master) |
| 35 | +def adminmask_command(bot, context, message, args): |
| 36 | + try: |
| 37 | + arg = args[1].lower() |
| 38 | + if arg == 'add': |
| 39 | + response = add_mask(context.database, args[2]) |
| 40 | + elif arg in ('del', 'rem'): |
| 41 | + response = del_mask(context.database, args[2]) |
| 42 | + elif arg in ('show', 'list'): |
| 43 | + response = show_masks(context.database) |
| 44 | + else: |
| 45 | + response = 'Error: Invalid argument;' |
| 46 | + except IndexError: |
| 47 | + response = "Not enough arguments provided." |
| 48 | + return response, Notice(context.nick) |
| 49 | + |
| 50 | + |
| 51 | +def add_mask(database, mask): |
| 52 | + masks = database.get([]) |
| 53 | + if mask not in masks: |
| 54 | + masks.append(mask) |
| 55 | + database.set(masks) |
| 56 | + response = "Mask added successfully." |
| 57 | + else: |
| 58 | + response = "Error: Mask already in masks list." |
| 59 | + return response |
| 60 | + |
| 61 | + |
| 62 | +def del_mask(database, mask): |
| 63 | + masks = database.get([]) |
| 64 | + try: |
| 65 | + masks.remove(mask) |
| 66 | + database.set(masks) |
| 67 | + response = "Mask successfully deleted." |
| 68 | + except ValueError: |
| 69 | + response = "Error: Mask not in masks list." |
| 70 | + return response |
83 | 71 |
|
84 | 72 |
|
85 |
| -@hook('NICK') |
86 |
| -def handle_nick(bot, context, message): |
87 |
| - """ Unmark a user as verified in the bot and check new nick. """ |
88 |
| - unverify(bot, context.session, message.nick) |
89 |
| - check(bot, context.session, message.params[0]) |
| 73 | +def show_masks(database): |
| 74 | + masks = database.get([]) |
90 | 75 |
|
| 76 | + if masks: |
| 77 | + response = split_response(masks, "Admin masks: {};") |
| 78 | + else: |
| 79 | + response = "I don't have any admin masks." |
91 | 80 |
|
92 |
| -@hook('QUIT') |
93 |
| -def handle_quit(bot, context, message): |
94 |
| - """ Unmark a user as verified in the bot upon quit. """ |
95 |
| - unverify(bot, context.session, message.nick) |
| 81 | + return response |
0 commit comments