1
# rudimentary authentication trough nickserv
2
# Wijnand 'tehmaze' Modderman - http://tehmaze.com
5
from gozerbot.utils.generic import convertpickle
6
from gozerbot.callbacks import callbacks
7
from gozerbot.commands import cmnds
8
from gozerbot.datadir import datadir
9
from gozerbot.fleet import fleet
10
from gozerbot.users import users
11
from gozerbot.persist.pdod import Pdod
12
from gozerbot.plughelp import plughelp
13
from gozerbot.tests import tests
17
plughelp.add('identify', 'auto-merges identified users')
22
convertpickle(datadir + os.sep + 'old' + os.sep + 'identify', \
23
datadir + os.sep + 'plugs' + os.sep + 'identify' + os.sep + 'identify')
27
class IdManager(Pdod):
29
Pdod.__init__(self, os.path.join(datadir, 'identify'))
33
for bot in fleet.bots:
37
if not self.data.has_key(bot.name):
38
self.data[bot.name] = {}
40
def add(self, bot, nick, user):
42
self.data[bot.name][nick] = user
45
def get(self, bot, nick):
46
if not self.data.has_key(bot.name):
48
if not self.data[bot.name].has_key(nick):
50
return self.data[bot.name][nick]
52
def lookup(self, bot, nick, userhost):
53
user = self.get(bot, nick)
55
users.adduserhost(user, userhost)
59
def remove(self, bot, nick):
60
if not self.data.has_key(bot.name):
62
if not self.data[bot.name].has_key(nick):
64
del self.data[bot.name][nick]
68
idmanager = IdManager()
69
if not idmanager.data:
70
idmanager = IdManager()
72
def handle_id(bot, ievent):
74
ievent.missing('<nick>')
76
ievent.reply('requesting userinfo for %s' % ievent.args[0])
77
bot.sendraw('WHOIS %s' % ievent.args[0])
79
cmnds.add('id', handle_id, ['OPER'])
82
def handle_idadd(bot, ievent):
83
if len(ievent.args) != 2:
84
ievent.missing('<nick> <user>')
86
if idmanager.get(bot, ievent.args[0]):
87
ievent.reply('%s is already known on %s' % (ievent.args[0], bot.name))
89
if not users.exist(ievent.args[1].lower()):
90
ievent.reply('user %s unknown' % ievent.args[1].lower())
93
idmanager.add(bot, ievent.args[0], ievent.args[1].lower())
96
cmnds.add('id-add', handle_idadd, 'OPER')
99
def handle_idlist(bot, ievent):
100
ievent.reply(str(idmanager.data))
102
cmnds.add('id-list', handle_idlist, 'OPER')
105
def handle_JOIN(bot, ievent):
106
user = users.getname(ievent.userhost)
108
user = idmanager.lookup(bot, ievent.nick, ievent.userhost)
110
bot.sendraw('WHOIS %s' % ievent.nick)
112
callbacks.add('JOIN', handle_JOIN)
114
def handle_320_330(bot, ievent):
115
text = ' '.join(ievent.arguments[2:])
116
#bot.sendraw('PRIVMSG #dunkbots :%s' % str(ievent))
117
# IRC protocol sucks, no generic code for identified users :-(
119
if ievent.cmnd == '320' and 'is identified to services' in text:
121
nick = ievent.arguments[1]
122
userhost = bot.userhosts.data[nick]
123
idmanager.lookup(bot, nick, userhost)
124
#bot.sendraw('PRIVMSG #dunkbots :%s is identified (320/freenode)' % nick)
125
elif ievent.cmnd == '330' and 'is logged in as' in text:
127
nick = ievent.arguments[1]
128
userhost = bot.userhosts.data[nick]
129
idmanager.lookup(bot, nick, userhost)
130
#bot.sendraw('PRIVMSG #dunkbots :%s is identified (330/undernet)' % nick)
132
callbacks.add('320', handle_320_330)
133
callbacks.add('330', handle_320_330)