Example #1
0
 def __post_init__(self) -> None:
     self._updatedAt = m.create(m.RcDatetime, self._updatedAt)
     self.ts = m.try_create(m.RcDatetime, self.ts)
     self.lm = m.try_create(m.RcDatetime, self.lm)
     self.t = m.create(m.RoomType, self.t)
     self.u = m.try_create(UserRef, self.u)
     self.lastMessage = m.try_create(Message, self.lastMessage)
Example #2
0
async def _get_or_create_public_room(master: master.Master,
                                     roomname: str) -> m.Room:
    result = (await master.rest.channels_info(channel=roomname)).json()
    if not result['success']:
        result = (await master.rest.channels_create(name=roomname)).json()

    return m.create(m.Room, result['channel'])
Example #3
0
async def _get_or_create_private_group(master: master.Master,
                                       roomname: str) -> m.Room:
    result = (await master.rest.groups_info(room_name=roomname)).json()
    if not result['success']:
        result = (await master.rest.groups_create(name=roomname)).json()

    return m.create(m.Room, result['group'])
Example #4
0
async def main() -> None:
    loop = asyncio.get_event_loop()

    masterbot = master.Master(c.SERVER, c.BOTNAME, c.PASSWORD, loop=loop)

    # Get room info of the statusroom
    await masterbot.rest.login(c.BOTNAME, c.PASSWORD)
    result = (await
              masterbot.rest.rooms_info(room_name=c.POLL_STATUS_ROOM)).json()
    statusroom = m.create(m.Room, result['room'])
    pollmanager = await pollutil.PollManager.create_pollmanager(
        master=masterbot,
        botname=c.BOTNAME,
        statusroom=statusroom.to_roomref())

    # Create commands
    usage = com.Usage(master=masterbot)
    ping = com.Ping(master=masterbot)
    poll = com.Poll(master=masterbot, pollmanager=pollmanager)

    # Add a bot reacting on direct messages
    masterbot.bots.append(
        bots.RoomTypeCommandBot(master=masterbot,
                                username=c.BOTNAME,
                                enable_direct_message=True,
                                commands=[usage, ping, poll]))

    async with masterbot:
        logging.info(f'{c.BOTNAME} is ready')
        await masterbot.ddp.disconnection()
Example #5
0
 async def send_message(self, roomId: str, message: str) -> m.Message:
     """Send a message to a room
     """
     response = await self.client.call("sendMessage", {
         "rid": roomId,
         "msg": message
     })
     return m.create(m.Message, response)
Example #6
0
async def setup_bot() -> master.Master:

    # Overwrite +1,+2,+3,ΓΌ4 emoji with custom ones
    pollutil.NUMBER_EMOJI_TO_VALUE = {
        ':x1:': 1,
        ':x2:': 2,
        ':x3:': 3,
        ':x4:': 4,
    }

    loop = asyncio.get_event_loop()

    masterbot = master.Master(c.SERVER, c.BOTNAME, c.PASSWORD, loop=loop)
    await masterbot.rest.login(c.BOTNAME, c.PASSWORD)

    result = (await
              masterbot.rest.rooms_info(room_name=c.POLL_STATUS_ROOM)).json()
    statusroom = m.create(m.Room, result['room'])
    pollmanager = await pollutil.PollManager.create_pollmanager(
        master=masterbot,
        botname=c.BOTNAME,
        statusroom=statusroom.to_roomref())

    usage = com.Usage(master=masterbot)
    ping = com.Ping(master=masterbot)
    poll = com.Poll(master=masterbot, pollmanager=pollmanager)
    notify = com.CatchAll(master=masterbot, callback=com.private_message_user)

    dms = com2.Dms(master=masterbot, token=c.DMS_TOKEN)
    etm = com2.Etm(master=masterbot, pollmanager=pollmanager)
    food = com2.Food(master=masterbot)
    birthday = com2.Birthday(master=masterbot)

    # Public command bot
    masterbot.bots.append(
        bots.RoomTypeMentionCommandBot(master=masterbot,
                                       username=c.BOTNAME,
                                       enable_public_channel=True,
                                       enable_private_groups=True,
                                       commands=[ping, notify]))
    # Direct message bot
    masterbot.bots.append(
        bots.RoomTypeCommandBot(
            master=masterbot,
            username=c.BOTNAME,
            enable_direct_message=True,
            commands=[usage, ping, dms, food, poll, birthday]))
    # Mensa bot
    masterbot.bots.append(
        bots.RoomCommandBot(master=masterbot,
                            username=c.BOTNAME,
                            whitelist=[c.MENSA_ROOM],
                            commands=[etm],
                            show_usage_on_unknown=False))

    return masterbot
Example #7
0
 async def login(self, username: str, password: str) -> m.LoginResult:
     """Login with the given credentials"""
     response = await self._call("login", {
         "user": {
             "username": username
         },
         "password": password
     })
     self.logged_in = True
     return m.create(m.LoginResult, response)
Example #8
0
 async def send_message(self, roomId: str, message: str) -> m.Message:
     """Send a message to a room
     """
     response = await self._call("sendMessage", {
         "rid": roomId,
         "msg": message
     })
     if response is None:
         raise exp.RocketClientException("Could not send message.")
     return m.create(m.Message, response)
Example #9
0
def setup_admin() -> None:
    """This function is executed before any integration test is run.

    The admin is created here because the first user is by default admin
    """

    global _admin_user

    # This function uses the default RocketChat Client because it cannot be async and
    # since this is the first function it cannot break due to the ratelimiter
    rest = RocketChat()
    result = rest.users_register(username='******',
                                 name='Administrator',
                                 email='*****@*****.**',
                                 password='******').json()
    if result['success']:
        _admin_user = m.create(m.User, result['user'])
    else:
        rest.login(user='******', password='******')
        result = rest.users_info(username='******').json()
        _admin_user = m.create(m.User, result['user'])
Example #10
0
 async def room(self,
                *,
                room_id: Optional[str] = None,
                room_name: Optional[str] = None) -> m.Room:
     if room_id is not None:
         if room_id not in self._roomid_cache:
             try:
                 result = (await
                           self.rest.rooms_info(room_id=room_id)).json()
                 if 'room' in result:
                     room = m.create(m.Room, result['room'])
                     self._roomid_cache[room_id] = room
                     if room.name is not None:
                         self._roomname_cache[room.name] = room
                 else:
                     result['roomId'] = room_id
                     raise exp.RocketBotException(result)
             except RocketConnectionException as e:
                 raise exp.RocketClientException(e)
         return self._roomid_cache[room_id]
     if room_name is not None:
         if room_name not in self._roomname_cache:
             try:
                 result = (await self.rest.rooms_info(room_name=room_name
                                                      )).json()
                 if 'room' in result:
                     room = m.create(m.Room, result['room'])
                     self._roomid_cache[room._id] = room
                     self._roomname_cache[room_name] = room
                 else:
                     result['roomName'] = room_name
                     raise exp.RocketBotException(result)
             except RocketConnectionException as e:
                 raise exp.RocketClientException(e)
         return self._roomname_cache[room_name]
     raise exp.RocketBotException(
         "You have to specify either room_id or room_name.")
Example #11
0
    async def handle(self, command: str, args: str,
                     message: m.Message) -> None:
        """Handle the incoming message
        """
        if command == 'birthday':
            if len(message.mentions) == 0:
                await self.master.ddp.send_message(
                    message.roomid, "Please mention a user with `@user`")
                return

            user = message.mentions[0]
            if user.username == message.created_by.username:
                await self.master.ddp.send_message(
                    message.roomid,
                    "Please mention someone other than yourself")
                return

            result = await self.master.rest.users_list(count=0)
            users = [m.create(m.User, u) for u in result.json()['users']]

            username = user.name if user.name is not None else user.username
            username = re.sub(r'\s', '_', username).lower()
            name = f'geburtstag_{username}'
            members = [
                u.username for u in users if u.username != user.username
            ]
            result = await self.master.rest.groups_create(name=name,
                                                          members=members)

            if result.status_code != 200:
                await self.master.ddp.send_message(message.roomid,
                                                   result.json()['error'])
                return
            room = m.create(m.Room, result.json()['group'])
            await self.master.rest.groups_add_owner(
                room_id=room._id, user_id=message.created_by._id)
Example #12
0
async def _get_or_create_user(master: master.Master,
                              username: str,
                              displayname: str,
                              *,
                              roles: List[str] = ['user']) -> m.User:

    result = (await master.rest.users_info(username=username)).json()
    if not result['success']:
        result = (await
                  master.rest.users_create(username=username,
                                           name=displayname,
                                           email=f'{username}@example.com',
                                           password=username,
                                           roles=roles)).json()

    return m.create(m.User, result['user'])
Example #13
0
    def __init__(self, kwargs: Any) -> None:
        self.id: str = kwargs['_id']
        self.roomid: str = kwargs['rid']
        self.msg: str = kwargs['msg']

        self.created_at = m.create(m.RcDatetime, kwargs['ts'])
        self.created_by = m.create(UserRef, kwargs['u'])
        self.updated_at = m.create(m.RcDatetime, kwargs['_updatedAt'])
        self.edited_at = m.try_create(m.RcDatetime, kwargs.get('editedAt'))
        self.edited_by = m.try_create(m.UserRef, kwargs.get('editedBy'))
        self.pinned_at = m.try_create(m.RcDatetime, kwargs.get('pinnedAt'))
        self.pinned_by = m.try_create(m.UserRef, kwargs.get('pinnedBy'))

        self.message_type = m.create(m.MessageType,
                                     kwargs.get('t'),
                                     default=m.MessageType.STANDARD_MESSAGE)
        self.role_type = m.create(m.RoleType,
                                  kwargs.get('role'),
                                  default=m.RoleType.NONE)

        self.attachments = [
            m.create(Attachment, a) for a in kwargs.get('attachments', list())
        ]
        self.channels = [
            m.create(RoomRef, l) for l in kwargs.get('channels', list())
        ]
        self.mentions = [
            m.create(UserRef, u) for u in kwargs.get('mentions', list())
        ]
        self.urls = [m.create(Link, l) for l in kwargs.get('urls', list())]

        self.reactions = kwargs.get('reactions', dict())
        self.file = m.try_create(File, kwargs.get('file'))

        self.groupable = kwargs.get('groupable')
        self.parseUrls = kwargs.get('parseUrls')
        self.pinned = kwargs.get('pinned')
Example #14
0
async def is_private_group_member(user: master.Master, groupname: str) -> bool:
    result = await user.rest.groups_list()
    groups = [m.create(m.Room, g) for g in result.json()['groups']]

    return any([g for g in groups if g.name is not None and g.name == groupname])
Example #15
0
 def __post_init__(self) -> None:
     self.ts = m.create(m.RcDatetime, self.ts)
     if len(self.attachments) != 0:
         self.attachments = [
             m.create(Attachment, a) for a in self.attachments
         ]
Example #16
0
 def __post_init__(self) -> None:
     self.createdAt = m.try_create(m.RcDatetime, self.createdAt)
     self._updatedAt = m.try_create(m.RcDatetime, self._updatedAt)
     self.lastLogin = m.try_create(m.RcDatetime, self.lastLogin)
     if self.roles is not None:
         self.roles = [m.create(m.RoleType, r) for r in self.roles]
Example #17
0
 def __post_init__(self) -> None:
     self.messages = [
         models.create(models.Message, m) for m in self.messages
     ]
     self.firstUnread = models.create(models.Message, self.firstUnread)
Example #18
0
 def __post_init__(self) -> None:
     self.update = [models.create(models.Room, r) for r in self.update]
     self.remove = [models.create(models.Room, r) for r in self.remove]
Example #19
0
 def __post_init__(self) -> None:
     self.tokenExpires = models.create(models.RcDatetime, self.tokenExpires)
Example #20
0
 async def get_all_rooms(self) -> List[m.Room]:
     """Get all the rooms a user belongs to.
     """
     response = await self.client.call("rooms/get")
     return [m.create(m.Room, r) for r in response]
Example #21
0
 def __post_init__(self) -> None:
     arg0 = cast(models.Message, self.args[0])  # pylint: disable=E1136
     self.message = models.create(models.Message, arg0)
     if len(self.args) > 1:
         arg1 = cast(models.RoomRef2, self.args[1])  # pylint: disable=E1136
         self.room = models.create(models.RoomRef2, arg1)
Example #22
0
 def __post_init__(self):
     self.message = models.create(models.Message, self.args[0])  # pylint: disable=E1136
     if len(self.args) > 1:
         self.room = models.create(models.RoomRef2, self.args[1])  # pylint: disable=E1136