# Path: hypebot/hype_types.py

# 
# Path: hypebot/core/params_lib.py
# def _ParseChannel(channel):
# def _ParseChannels(channels):
#   def __init__(self, defaults=None):
#   def __str__(self):
#   def Override(self, params):
#   def _AssignValueConvertDict(self, key, value):
#   def _ParseDict(self, params):
#   def __setattr__(self, key, value):
#   def get(self, key, default_value=None):  # pylint: disable=invalid-name
#   def AsDict(self):
#   def Lock(self):
#   def _RaiseIfLocked(self):
# def MergeParams(defaults, *overrides):
# class HypeParams(object):
#   SPECIAL_ATTRS = ['_locked']
#   HAS_DYNAMIC_ATTRIBUTES = True
# 
# Path: hypebot/interfaces/interface_lib.py
# class BaseChatInterface(with_metaclass(abc.ABCMeta)):
#   DEFAULT_PARAMS = params_lib.HypeParams({
#       # Display name used when chatting.
#       'name': 'chatbot',
#   })
#   def __init__(self, params):
#   def RegisterHandlers(self, on_message_fn, user_tracker, user_prefs):
#   def Join(self, channel: hype_types.Channel):
#   def Leave(self, channel: hype_types.Channel):
#   def Loop(self):
#   def FindUser(self, query: Text) -> Optional[user_pb2.User]:
#   def WhoAll(self):
#   def SendMessage(self, channel: hype_types.Channel,
#                   message: Optional[hype_types.Message]):
#   def SendDirectMessage(self, user: user_pb2.User, message: hype_types.Message):
#   def Notice(self, channel: hype_types.Channel, message: hype_types.Message):
#   def Topic(self, channel: hype_types.Channel, new_topic: Text):


import re
import asyncio
import discord
from absl import logging
from typing import Optional, Text
from hypebot import hype_types
from hypebot.core import params_lib
from hypebot.interfaces import interface_lib
from hypebot.protos import channel_pb2
from hypebot.protos import user_pb2
    for guild in self._client.guilds:
      for member in guild.members:
        if member.name == user:
          if member.bot:
            self._user_tracker.AddBot(user)
          else:
            self._user_tracker.AddHuman(user)

  def WhoAll(self):
    for guild in self._client.guilds:
      for member in guild.members:
        self._user_tracker.AddUser(user_pb2.User(
            user_id=str(member.id),
            display_name=member.display_name,
            bot=member.bot))

  def _FindDiscordUser(self, user_id: int) -> Optional[discord.Member]:
    """Find the corresponding user on any of the connected guilds.

    Args:
      user: Nick of user.

    Returns:
      The corresponding discord member if they exist, otherwise None.
    """
    for guild in self._client.guilds:
      member = discord.utils.find(lambda m: m.id == user_id, guild.members)
      if member:
        return member


# Path: hypebot/hype_types.py

# 
# Path: hypebot/core/params_lib.py
# def _ParseChannel(channel):
# def _ParseChannels(channels):
#   def __init__(self, defaults=None):
#   def __str__(self):
#   def Override(self, params):
#   def _AssignValueConvertDict(self, key, value):
#   def _ParseDict(self, params):
#   def __setattr__(self, key, value):
#   def get(self, key, default_value=None):  # pylint: disable=invalid-name
#   def AsDict(self):
#   def Lock(self):
#   def _RaiseIfLocked(self):
# def MergeParams(defaults, *overrides):
# class HypeParams(object):
#   SPECIAL_ATTRS = ['_locked']
#   HAS_DYNAMIC_ATTRIBUTES = True
# 
# Path: hypebot/interfaces/interface_lib.py
# class BaseChatInterface(with_metaclass(abc.ABCMeta)):
#   DEFAULT_PARAMS = params_lib.HypeParams({
#       # Display name used when chatting.
#       'name': 'chatbot',
#   })
#   def __init__(self, params):
#   def RegisterHandlers(self, on_message_fn, user_tracker, user_prefs):
#   def Join(self, channel: hype_types.Channel):
#   def Leave(self, channel: hype_types.Channel):
#   def Loop(self):
#   def FindUser(self, query: Text) -> Optional[user_pb2.User]:
#   def WhoAll(self):
#   def SendMessage(self, channel: hype_types.Channel,
#                   message: Optional[hype_types.Message]):
#   def SendDirectMessage(self, user: user_pb2.User, message: hype_types.Message):
#   def Notice(self, channel: hype_types.Channel, message: hype_types.Message):
#   def Topic(self, channel: hype_types.Channel, new_topic: Text):


# Path: hypebot/interfaces/discord_interface.py
import re
import asyncio
import discord
from absl import logging
from typing import Optional, Text
from hypebot import hype_types
from hypebot.core import params_lib
from hypebot.interfaces import interface_lib
from hypebot.protos import channel_pb2
from hypebot.protos import user_pb2

    for guild in self._client.guilds:
      for member in guild.members:
        if member.name == user:
          if member.bot:
            self._user_tracker.AddBot(user)
          else:
            self._user_tracker.AddHuman(user)

  def WhoAll(self):
    for guild in self._client.guilds:
      for member in guild.members:
        self._user_tracker.AddUser(user_pb2.User(
            user_id=str(member.id),
            display_name=member.display_name,
            bot=member.bot))

  def _FindDiscordUser(self, user_id: int) -> Optional[discord.Member]:
    """Find the corresponding user on any of the connected guilds.

    Args:
      user: Nick of user.

    Returns:
      The corresponding discord member if they exist, otherwise None.
    """
    for guild in self._client.guilds:
      member = discord.utils.find(lambda m: m.id == user_id, guild.members)
      if member:
        return member


  def Notice(self, channel: channel_pb2.Channel, message: hype_types.Message):