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
Beispiel #2
0
  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)
Beispiel #3
0
    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)
Beispiel #4
0
  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)
Beispiel #5
0
    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