Exemple #1
0
class BotState(object):
    def __init__(self, bot):
        self.bot = bot
        self.channels_by_id = {}
        self.users_by_session = {}
        self.users_by_id = {}
        self.root = None
        self.permissions = None
        # The user object representing the bot.
        self.user = None
        # The current channel the bot is in.
        self.channel = None

    def get_actor(self, session_id):
        if not session_id in self.users_by_session:
            LOGGER.warning('Invalid session ID: %d.' % session_id)
            return None
        else:
            return self.users_by_session[session_id]

    def get_channel(self, chan_id):
        if not chan_id in self.channels_by_id:
            LOGGER.warning('Invalid Channel ID: %d.' % chan_id)
            return None
        else:
            return self.channels_by_id[chan_id]

    def on_version(self, msg):
        self.version = msg.version
        self.release = msg.release
        self.os = msg.os
        self.os_version = msg.os_version

    def on_voice_ping(self, session_id):
        self.bot.on_voice_ping(session_id)

    def on_voice_talk(self, from_id, sequence, data):
        self.bot.on_voice_talk(self.get_actor(from_id), sequence, data)

    def on_voice_whisper_chan(self, from_id, sequence, data):
        pass

    def on_voice_whisper_self(self, from_id, sequence, data):
        pass

    def on_pingback(self, ping_msec, msg):
        self.ping = ping_msec
        self.packet_stats = (msg.good, msg.late, msg.lost)
        self.udp_stats = (msg.udp_packets, msg.udp_ping_avg, msg.udp_ping_var)

    def on_reject(self, msg):
        self.rejected = True
        self.reject_type = msg.type
        self.reject_reason = msg.reason
        self.bot.rejected()

    def on_server_config(self, msg):
        self.welcome_text = msg.welcome_text
        self.allow_html = msg.allow_html

    def on_server_sync(self, msg):
        self.max_bandwidth = msg.max_bandwidth
        self.welcome_text = msg.welcome_text
        if msg.permissions:
            if not self.permissions:
                self.permissions = Permissions(msg.permissions)
            else:
                self.permissions.update(msg.permissions)
        self.bot.connected()

    def on_channel_state(self, msg):
        if msg.channel_id not in self.channels_by_id:
            chan = Channel(self.bot, msg.channel_id)
            self.channels_by_id[msg.channel_id] = chan
        else:
            chan = self.channels_by_id[msg.channel_id]
        chan.update(msg)

        if msg.parent == msg.channel_id:
            if not msg.channel_id == 0:
                LOGGER.warning('Root channel not ID 0.')
            if self.root and self.root != chan:
                LOGGER.error('Received 2 different roots...?')
                raise Exception('Two roots.')
            self.root = chan
        elif chan.parent:
            if chan.parent.id != msg.parent:
                chan.parent.remove_child(chan)
                self.channels_by_id[msg.parent].add_child(chan)
        else:
            if not msg.parent in self.channels_by_id:
                LOGGER.error(
                    'Parent ID passed by server is not in the channel list.')
                raise Exception('Invalid Parent.')
            self.channels_by_id[msg.parent].add_child(chan)

    def on_user_state(self, msg):
        if msg.session not in self.users_by_session:
            user = User(self.bot, msg.session)
            self.users_by_session[msg.session] = user
            if msg.user_id is not None:
                self.users_by_id[msg.user_id] = user
        else:
            user = self.users_by_session[msg.session]
        user.update(msg)
        if self.user is None:
            self.user = user

    def on_text_message(self, msg):
        self.bot.on_text_message(
            from_user=self.get_actor(msg.actor),
            to_users=[self.get_actor(x) for x in msg.session],
            to_channels=[self.get_channel(x) for x in msg.channel_id],
            tree_ids=msg.tree_id,
            message="%s" % msg.message)

    def on_crypt_setup(self, msg):
        pass

    def on_user_stats(self, msg):
        assert msg.session in self.users_by_session
        self.users_by_session[msg.session].update_stats(msg)

    def on_unknown(self, type, msg):
        LOGGER.warning("Unknown message received: type(%s), '%s'" %
                       (type, msg))
Exemple #2
0
class BotState(object):
  def __init__(self, bot):
    self.bot = bot
    self.channels_by_id = {}
    self.users_by_session = {}
    self.users_by_id = {}
    self.root = None
    self.permissions = None
    # The user object representing the bot.
    self.user = None
    # The current channel the bot is in.
    self.channel = None

  def get_actor(self, session_id):
    if not session_id in self.users_by_session:
      LOGGER.warning('Invalid session ID: %d.' % session_id)
      return None
    else:
      return self.users_by_session[session_id]

  def get_channel(self, chan_id):
    if not chan_id in self.channels_by_id:
      LOGGER.warning('Invalid Channel ID: %d.' % chan_id)
      return None
    else:
      return self.channels_by_id[chan_id]

  def on_version(self, msg):
    self.version = msg.version
    self.release = msg.release
    self.os = msg.os
    self.os_version = msg.os_version

  def on_voice_ping(self, session_id):
    self.bot.on_voice_ping(session_id)

  def on_voice_talk(self, from_id, sequence, data):
    self.bot.on_voice_talk(self.get_actor(from_id), sequence, data)

  def on_voice_whisper_chan(self, from_id, sequence, data):
    pass

  def on_voice_whisper_self(self, from_id, sequence, data):
    pass

  def on_pingback(self, ping_msec, msg):
    self.ping = ping_msec
    self.packet_stats = (msg.good, msg.late, msg.lost)
    self.udp_stats = (msg.udp_packets, msg.udp_ping_avg, msg.udp_ping_var)

  def on_reject(self, msg):
    self.rejected = True
    self.reject_type = msg.type
    self.reject_reason = msg.reason
    self.bot.rejected()

  def on_server_config(self, msg):
    self.welcome_text = msg.welcome_text
    self.allow_html = msg.allow_html

  def on_server_sync(self, msg):
    self.max_bandwidth = msg.max_bandwidth
    self.welcome_text = msg.welcome_text
    if msg.permissions:
      if not self.permissions:
        self.permissions = Permissions(msg.permissions)
      else:
        self.permissions.update(msg.permissions)
    self.bot.connected()

  def on_channel_state(self, msg):
    if msg.channel_id not in self.channels_by_id:
      chan = Channel(self.bot, msg.channel_id)
      self.channels_by_id[msg.channel_id] = chan
    else:
      chan = self.channels_by_id[msg.channel_id]
    chan.update(msg)

    if msg.parent == msg.channel_id:
      if not msg.channel_id == 0:
        LOGGER.warning('Root channel not ID 0.')
      if self.root and self.root != chan:
        LOGGER.error('Received 2 different roots...?')
        raise Exception('Two roots.')
      self.root = chan
    elif chan.parent:
      if chan.parent.id != msg.parent:
        chan.parent.remove_child(chan)
        self.channels_by_id[msg.parent].add_child(chan)
    else:
      if not msg.parent in self.channels_by_id:
        LOGGER.error('Parent ID passed by server is not in the channel list.')
        raise Exception('Invalid Parent.')
      self.channels_by_id[msg.parent].add_child(chan)

  def on_user_state(self, msg):
    if msg.session not in self.users_by_session:
      user = User(self.bot, msg.session)
      self.users_by_session[msg.session] = user
      if msg.user_id is not None:
        self.users_by_id[msg.user_id] = user
    else:
      user = self.users_by_session[msg.session]
    user.update(msg)
    if self.user is None:
      self.user = user

  def on_text_message(self, msg):
    self.bot.on_text_message(from_user = self.get_actor(msg.actor),
                             to_users = [self.get_actor(x)
                                 for x in msg.session],
                             to_channels = [self.get_channel(x)
                                 for x in msg.channel_id],
                             tree_ids = msg.tree_id,
                             message = "%s" % msg.message)

  def on_crypt_setup(self, msg):
    pass

  def on_user_stats(self, msg):
    assert msg.session in self.users_by_session
    self.users_by_session[msg.session].update_stats(msg)

  def on_unknown(self, type, msg):
    LOGGER.warning("Unknown message received: type(%s), '%s'" % (type, msg))