def _set_user_nick(self, plainjid, nick, increase=True): """set a user's nick in database return the old `User` document, raise ValueError if duplicate `increase` tells if this is an auto action so that the counter should not be increased This will reset the nick cache. """ if getattr(config, "nick_change_interval", None): if ( self.current_user.nick_changes and self.now - self.current_user.nick_lastchange < config.nick_change_interval ): d = seconds2time(config.nick_change_interval.total_seconds()) raise Forbidden(_("you can't change your nick too often; only once in %s is allowed.") % d) models.validate_nick(nick) if self.nick_exists(nick): raise ValueError(_("duplicate nick name: %s") % nick) self.user_get_nick.cache_clear() update = {"$set": {"nick": nick, "nick_lastchange": self.now}} if increase: update["$inc"] = {"nick_changes": 1} ret = models.connection.User.collection.find_and_modify({"jid": plainjid}, update) self.current_user.reload() return ret
def run(self, jid, s, use_roster_nick): s.send_message(jid, s.welcome) s.get_vcard(jid, self.switch) stanza = self.parent.switch() if use_roster_nick or stanza.stanza_type == 'error': nick = s.get_name(jid) else: try: nick = stanza.as_xml.find('{vcard-temp}vCard/{vcard-temp}FN').text if nick is None: logger.warn('%s\'s vCard has a `None\' nick: %r', jid, stanza.as_xml) nick = s.get_name(jid) except AttributeError: #None nick = s.get_name(jid) while s.nick_exists(nick): nick += '_' try: models.validate_nick(nick) except models.ValidationError: nick = hashjid(jid) msg = _('Would you like to use "%s" as your nick, '\ 'or use "%snick your_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)
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)
def _set_user_nick(self, plainjid, nick, increase=True): '''set a user's nick in database return the old `User` document, raise ValueError if duplicate `increase` tells if this is an auto action so that the counter should not be increased This will reset the nick cache. ''' if getattr(config, "nick_change_interval", None): if self.current_user.nick_changes and \ self.now - self.current_user.nick_lastchange < config.nick_change_interval: d = seconds2time(config.nick_change_interval.total_seconds()) raise Forbidden( _("you can't change your nick too often; only once in %s is allowed." ) % d) models.validate_nick(nick) if self.nick_exists(nick): raise ValueError(_('duplicate nick name: %s') % nick) self.user_get_nick.cache_clear() update = { '$set': { 'nick': nick, 'nick_lastchange': self.now, } } if increase: update['$inc'] = {'nick_changes': 1} ret = models.connection.User.collection.find_and_modify( {'jid': plainjid}, update) self.current_user.reload() return ret