-
Notifications
You must be signed in to change notification settings - Fork 8
/
welcome.py
76 lines (68 loc) · 2.28 KB
/
welcome.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
#
# (C) Copyright 2012 lilydjwg <[email protected]>
#
# This file is part of xmpptalk.
#
# xmpptalk is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# xmpptalk is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with xmpptalk. If not, see <http://www.gnu.org/licenses/>.
#
import logging
import config
import models
from misc import *
logger = logging.getLogger(__name__)
nick_paths = ('{vcard-temp}vCard/{vcard-temp}FN', '{vcard-temp}vCard/{vcard-temp}N/{vcard-temp}FAMILY')
class Welcome:
def __init__(self, jid, xmpp, use_roster_nick=False):
'''
`jid` is a full `JID`, `xmpp` is the bot itself
`use_roster_nick` indicates if roster nick (or hashed jid) is preferred
because the user has alreadly joined but not in database
'''
self.s = s = xmpp
self.use_roster_nick = use_roster_nick
self.jid = jid
s.send_message(jid, s.welcome)
#FIXME: 超时处理
s.get_vcard(jid, self.vcard_got)
def vcard_got(self, stanza):
jid = self.jid
s = self.s
if self.use_roster_nick:
nick = s.get_name(jid)
elif stanza.stanza_type == 'error':
logger.warn('failed to get vCard')
nick = s.get_name(jid)
else:
for path in nick_paths:
nickel = stanza.as_xml().find(path)
if nickel is not None:
nick = nickel.text
if nick:
break
else:
nick = s.get_name(jid)
logger.warn('failed to get nick from vCard')
while s.nick_exists(nick):
nick += '_'
try:
models.validate_nick(nick)
except models.ValidationError:
nick = hashjid(jid)
msg = _('Your nick is default to "%s", '\
'you can use "%snick new_nick" to choose another.') % (
nick, config.prefix
)
s.send_message(jid, msg)
s.set_user_nick(str(jid.bare()), nick, increase=False)
logger.info('%s joined with nick %s', jid, nick)