-
Notifications
You must be signed in to change notification settings - Fork 1
/
users.py
100 lines (81 loc) · 3.44 KB
/
users.py
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
# Copyright (c) 2012 Dominic van Berkel
# See LICENSE for details.
import logging
class User(object):
_uid = 0
def __init__(self, nickname, username, hostmask, channel):
self.nickname = nickname
self.username = username
self.hostmask = hostmask
self.channels = set([channel])
self.alive = True
self.uid = self.next_uid()
@classmethod
def next_uid(cls):
cls._uid += 1
return cls._uid
class Users(object):
"""User management for Shirk.
Does not handle things like authentication, but keeps track of all visible
users to store slightly more permanent information between nickchanges.
Plugs are free to add their own attrs to the User objects, but keep in
mind that there's one of those for every user the bot shares a channel
with. It is recommended that plugs don't keep single User objects around
but instead at most a reference to the collective users dict.
"""
def __init__(self, core):
self.log = logging.getLogger('Users')
self.core = core
self.users_by_nick = {}
self.users_by_uid = {}
def by_nick(self, nickname):
return self.users_by_nick.get(nickname)
def by_uid(self, uid):
return self.users_by_uid.get(uid)
def user_joined(self, nickname, username, hostmask, channel):
if nickname in self.users_by_nick:
self.users_by_nick[nickname].channels.add(channel)
self.log.debug('Added user %s to channel %s'
% (nickname, channel))
else:
user = User(nickname, username, hostmask, channel)
self.users_by_nick[nickname] = user
self.users_by_uid[user.uid] = user
self.core.event_usercreated(user)
msg = 'Added user %s (uid=%d) to the global userlist, channel %s'
self.log.debug(msg % (nickname, user.uid, channel))
def user_left(self, nickname, channel):
"""A user is no longer in a channel due to a part or kick."""
if nickname in self.users_by_nick:
user = self.users_by_nick[nickname]
user.channels.discard(channel)
self.log.debug('Removed channel %s from user %s'
% (channel, nickname))
if not user.channels:
self.delete_user(user)
def user_quit(self, nickname):
"""A user has quit."""
if nickname in self.users_by_nick:
user = self.users_by_nick[nickname]
user.channels.clear()
self.delete_user(user)
def user_nickchange(self, oldnick, newnick):
"""A user has changed their nickname."""
if oldnick in self.users_by_nick:
user = self.users_by_nick[oldnick]
user.nickname = newnick
self.users_by_nick[newnick] = user
del self.users_by_nick[oldnick]
self.log.debug('Changed nickname of %s to %s'
% (oldnick, newnick))
self.core.event_userrenamed(user, oldnick)
def delete_user(self, user):
"""Deletes a user, as far as we can from here.
Sets the alive flag to False so any plugs that (erroneously!) hold a
reference to the user can know it's not valid anymore.
"""
user.alive = False
del self.users_by_nick[user.nickname]
del self.users_by_uid[user.uid]
self.core.event_userremoved(user)
self.log.debug('Removed user %s (uid=%d)' % (user.nickname, user.uid))