Commit e18c11814d7f7f805d4adac89573e5fe60524f09

  • avatar
  • Krister Svanlund <adsum @BIG…SH.(none)>
  • Mon Jun 22 12:47:02 CEST 2009
Services: Added support for channel access lists.
Todo
(3 / 3)
  
2828 - [X] Send 10 last updates in private on request.
2929 - [X] Expand shortened URL's. Using http://www.longurl.org
3030 - [X] Display screenames along with real name on tweets.
31* Chanserv/Nickserv [0/7]:
32 - [ ] Identify with nickserv.
31* Chanserv/Nickserv [2/7]:
32 - [X] Identify with nickserv.
3333 - [ ] Identify with chanserv on joining channel.
3434 - [ ] Register nickname.
3535 - [ ] Register channel.
3636 - [ ] Kick ghosts using nickserv.
3737 - [ ] Ban/Unban users using chanserv.
38 - [ ] Set user access depending on their current accesslevel on chanserv for certain channels.
38 - [X] Set user access depending on their current accesslevel on chanserv for certain channels.
3939* RSS [0/2]
4040 - [ ] Check if updated
4141 - [ ] Store last update
kofoo.py
(4 / 3)
  
768768 else:
769769 print " - Module settings are of wrong type."
770770 if init_module:
771 if init_module(self, sender):
771 if init_module(self, server, sender):
772772 print " + Successfully initiated module '%s'." % module
773773 if sender:
774774 server.privmsg(sender, "Successfully loaded module '%s'." % module)
889889 """ [Native Command]"""
890890 for module in args:
891891 self.unload_module(server, module, irclib.nm_to_n(sender))
892 self.respond(server, sender, target, "Unloaded '%s'." % module)
892893
893894 def do_save(self, server, sender, target, args):
894895 """ [Native Command]"""
937937 config_file = arg
938938
939939 irc = KoFoo()
940 reconnected = 0
940 reconnected = 1
941941 while not irc.want_to_quit:
942942 import time
943943 server = irc.server()
960960 irc.disconnect_all("Interrupted")
961961 print "Keyboard interruption captured."
962962 if irc.reconnect_timeout > 0:
963 print "Wait for reconnection '%.2e'." % (irc.reconnect_timeout*reconnected)
963 print "Wait for reconnection '%.2f'." % (irc.reconnect_timeout*reconnected)
964964 time.sleep(irc.reconnect_timeout*reconnected)
965965 reconnected -= 1
966966 if reconnected < 0:
  
44
55services_settings = { 'channel_passwords': {} }
66
7owned_channels = []
8getting_alist_from = None
9
710def init_services(bot, server, sender = None):
811 if type(bot.settings.bot_channel_list) is dict:
912 bot.settings.services_channel_passwords.extend(bot.settings.bot_channel_list)
1013 bot.settings.bot_channel_list = bot.settings.bot_channel_list.keys()
1114
12 identify_with_nickserv(bot, server, bot.settings.bot_nick_password)
15 identify_with_nickserv(bot, server)
1316
1417 for channel in bot.channel_list:
1518 identify_with_chanserv(bot, server, channel)
19 request_access_list(bot, server, channel)
20
21 return True
1622
1723def services_private_notice_handler(bot, server, sender, msg):
1824 if sender.lower() == "nickserv":
19 handle_nickserv_notice(bot, server, msg)
25 return handle_nickserv_notice(bot, server, msg)
2026 elif sender.lower() == "chanserv":
21 handle_chanserv_notice(bot, server, msg)
27 return handle_chanserv_notice(bot, server, msg)
2228
29def services_join_part_handler(bot, server, channel, join):
30 if join:
31 ### Handle join event ###
32 identify_with_chanserv(bot, server, channel)
33 request_access_list(bot, server, channel)
34 else:
35 ### Handle part event ###
36 if channel in owned_channels:
37 owned_channels.remove(channel)
38
2339##
2440# End of module interface
2541#####
5353 else:
5454 print " - Has no password for '%s'." % channel
5555
56
5756def register_with_nickserv(bot, server, email):
5857 print "Register %s with nickserv." % bot.settings.bot_nick_name
5958
6464
6565 server.privmsg("chanserv", "op %s %s" % (channel, user))
6666
67def request_access_list(bot, server, channel):
68 """Ask chanserv for access list for channel."""
69 print "Request access list for '%s'." % channel
70
71 server.privmsg("chanserv", "access %s list" % channel)
72
6773def handle_nickserv_notice(bot, server, msg):
6874 print "Notice from nickserv."
6975 if msg == "Your nickname isn't registered.":
7076 print " - Nickname not registered."
7177 bot.tell_users(server, "Nickname is not registered.", level=100, notice=True)
7278 #self.register_with_nickserv(self, server, self.settings.bot_nick_email)
73 return
79 return True
7480
7581 if msg[:17] == "Password accepted":
7682 print " + Successfully identified with nickserv."
7783 bot.tell_users(server, "Successfully identified with nickserv.", level=100, notice=True)
78 return
84 return True
7985
8086 res = re.match("STATUS (\S*) (\d)", msg)
8187 if res is not None:
9595 server.notice(user, "Command failed because you are not identified with nickserv.")
9696 if user in bot.on_user_id_do:
9797 del bot.on_user_id_do[user]
98 return
98 return True
9999
100 print " Unparsed message: %s" % msg
100 return False
101101
102102def handle_chanserv_notice(bot, server, msg):
103103 """On private notice from chanserv, similar to nickserv."""
104104 print "Notice from chanserv."
105105
106 res = re.match("Channel \\x02(.*)\\x02 isn't registered.", arg)
106 res = re.match('\s([0-9]{1,3})\s{2}(\S+)', msg)
107107 if res is not None:
108 try:
109 level = int(res.group(1))
110 user = res.group(2)
111 users = bot.settings.bot_user_list
112 old_level = users.get(user, level)
113 level = max(level, old_level)
114 users[user] = level
115 print " + '%s' has been given the level '%d'." % (user, level)
116 return True
117 except Exception, e:
118 print " - Could not parse string '%s': %s" % (msg, str(e))
119 return False
120
121 res = re.match("Channel \\x02(.*)\\x02 isn't registered.", msg)
122 if res is not None:
108123 channel = res.group(1)
109124 print " + Channel %s is not registered." % channel
110125 self.tell_users(server, "Channel %s is not registered." % channel, level=100, notice=True)
111 return
126 return True
112127
113 res = re.match("Password accepted -- .* \\x02(.*)\\x02.", arg)
128 res = re.match("Password accepted -- .* \\x02(.*)\\x02.", msg)
114129 if res is not None:
115130 channel = res.group(1)
116131 print " + Is taking control over %s." % channel
132 owned_channels.append(channel)
117133 self.make_op(server, channel, self.settings.bot_nick_name)
118134 self.tell_users(server, "Is taking control over %s." % channel, level=100, notice=True)
119 return
135 return True
120136
121 res = re.match("Opped \\x02(\S*)\\x02 on channel \\x02(\S*)\\x02.", arg)
137 res = re.match("Opped \\x02(\S*)\\x02 on channel \\x02(\S*)\\x02.", msg)
122138 if res is not None:
123139 user = res.group(1)
124140 channel = res.group(2)
142142 print " + Control over %s established." % channel
143143 else:
144144 print " + %s has been opped on %s." % (user, channel)
145 return
145 return True
146146
147 print " %s" % arg
147 res = re.match('(\S+) access list is empty.', msg)
148 if res is not None:
149 channel = res.group(1)
150 print " + Got empty access list from '%s'." % channel
151 getting_alist_from = None
152 return True
153
154 res = re.match('Access list for (\S+):', msg)
155 if res is not None:
156 channel = res.group(1)
157 if channel in owned_channels:
158 getting_alist_from = channel
159 else:
160 print " - Got accesslist from unknown channel '%s'." % channel
161 return True
162
163 res = re.match('End of list; ([0-9]+)/([0-9]+) matches shown.', msg)
164 if res is not None:
165 print " + Got complete access list from '%s'." % str(getting_alist_from)
166 getting_alist_from = None
167 return True
168
169 return False
  
1616update_test_delay = 60
1717update_test_time_left = 0
1818
19def init_test(bot, server_sender = None):
19def init_test(bot, server, sender = None):
2020 """Do things to initate the module and return True if
2121 successfull otherwise False."""
2222 print " + Initiate Test module."
2323 return True
2424
25def unload_test(bot, server_sender = None):
25def unload_test(bot, server, sender = None):
2626 """Do something on unloading the module."""
2727 print " + Unload Test module."
2828 return True