def test_mixing_together(self):
     message = RefAttach('user1') + ImageAttach('http://image.url') + LocationAttach('home', 32, 83) + SplitAttach(
         'token') + EmojiAttach(13, 9)
     self.assertEqual(message.get_text(), 'hometoken\ufffd')
     self.assertEqual(message.get_attachments(), [
         {
             'type': 'mentions',
             'loci': [[0, 0]],
             'user_ids': ['user1'],
         },
         {
             'type': 'image',
             'url': 'http://image.url',
         },
         {
             'type': 'location',
             'name': 'home',
             'lat': 32,
             'long': 83,
         },
         {
             'type': 'split',
             'token': 'token',
         },
         {
             'type': 'emoji',
             'charmap': [[13, 9]],
             'placeholder': '\ufffd',
         }
     ])
 def test_multiple_in_order(self):
     message = 'Test ' + RefAttach('user1', '@1') + RefAttach('user2', '@2') + RefAttach('user3', '@3')
     self.assertEqual(message.get_text(), 'Test @1@2@3')
     self.assertEqual(message.get_attachments(), [{
         'loci': [[5, 2], [7, 2], [9, 2]],
         'type': 'mentions',
         'user_ids': ['user1', 'user2', 'user3']
     }])
 def test_multiple_split(self):
     message = RefAttach('red_id', '@red') + ' vs. ' + RefAttach('blue_id', '@blue')
     self.assertEqual(message.get_text(), '@red vs. @blue')
     self.assertEqual(message.get_attachments(), [{
         'type': 'mentions',
         'loci': [[0, 4], [9, 5]],
         'user_ids': ['red_id', 'blue_id']
     }])
    def test_dynamic_creation_reverse_order(self):
        message = RefAttach('user_id_here', '@world') + ' how are you?'

        self.assertEqual(message.get_text(), '@world how are you?')
        self.assertEqual(message.get_attachments(), [{
            'loci': [[0, 6]],
            'type': 'mentions',
            'user_ids': ['user_id_here']
        }])
    def test_dynamic_creation_reverse_order(self) -> None:
        message = RefAttach("user_id_here", "@world") + " how are you?"

        self.assertEqual(message.get_text(), "@world how are you?")
        self.assertEqual(
            message.get_attachments(),
            [{
                "loci": [[0, 6]],
                "type": "mentions",
                "user_ids": ["user_id_here"]
            }],
        )
 def test_multiple_split(self) -> None:
     message = RefAttach("red_id", "@red") + " vs. " + RefAttach(
         "blue_id", "@blue")
     self.assertEqual(message.get_text(), "@red vs. @blue")
     self.assertEqual(
         message.get_attachments(),
         [{
             "type": "mentions",
             "loci": [[0, 4], [9, 5]],
             "user_ids": ["red_id", "blue_id"],
         }],
     )
 def test_multiple_in_order(self) -> None:
     message = ("Test " + RefAttach("user1", "@1") +
                RefAttach("user2", "@2") + RefAttach("user3", "@3"))
     self.assertEqual(message.get_text(), "Test @1@2@3")
     self.assertEqual(
         message.get_attachments(),
         [{
             "loci": [[5, 2], [7, 2], [9, 2]],
             "type": "mentions",
             "user_ids": ["user1", "user2", "user3"],
         }],
     )
Esempio n. 8
0
def user_named_saucerbot(bot: Bot, message: Message, force_random: bool = False) -> bool:
    """
    Chastise people who make their name saucerbot
    """
    if message.name != 'saucerbot':
        return False

    # Send something dumb
    user_attach = RefAttach(message.user_id, f'@{message.name}')

    msg = random.choice(SAUCERBOT_MESSAGE_LIST)

    if force_random or msg == 'random':
        insult = get_insult()
        prefix = "Stop being a"
        if insult[0].lower() in ['a', 'e', 'i', 'o', 'u']:
            prefix = prefix + 'n'

        msg = prefix + ' ' + insult + ', '

    if isinstance(msg, str):
        msg = msg + user_attach

    bot.post(msg)

    return True
 def test_hidden(self):
     message = 'Test' + RefAttach('user_id_here')
     self.assertEqual(message.get_text(), 'Test')
     self.assertEqual(message.get_attachments(), [{
         'loci': [[4, 0]],
         'type': 'mentions',
         'user_ids': ['user_id_here']
     }])
 def test_visible(self):
     message = 'Test ' + RefAttach('user_id_here', '@all')
     self.assertEqual(message.get_text(), 'Test @all')
     self.assertEqual(message.get_attachments(), [{
         'loci': [[5, 4]],
         'type': 'mentions',
         'user_ids': ['user_id_here']
     }])
    def test_manual_creation(self):
        message = ComplexMessage(['Hello, ', RefAttach('user_id_here', '@world')])

        self.assertEqual(message.get_text(), 'Hello, @world')
        self.assertEqual(message.get_attachments(), [{
            'loci': [[7, 6]],
            'type': 'mentions',
            'user_ids': ['user_id_here']
        }])
    def test_dynamic_creation(self):
        message = 'Hello, ' + RefAttach('user_id_here', '@world')

        self.assertEqual(message.get_text(), 'Hello, @world')
        self.assertEqual(message.get_attachments(), [{
            'loci': [[7, 6]],
            'type': 'mentions',
            'user_ids': ['user_id_here']
        }])
 def test_complex_message(self):
     message = ComplexMessage(['Hello, ', RefAttach('user_id_here', '@world')])
     text, attachments = smart_split_complex_message(message)
     self.assertEqual(text, 'Hello, @world')
     self.assertEqual(attachments, [{
         'loci': [[7, 6]],
         'type': 'mentions',
         'user_ids': ['user_id_here']
     }])
 def test_hidden(self) -> None:
     message = "Test" + RefAttach("user_id_here")
     self.assertEqual(message.get_text(), "Test")
     self.assertEqual(
         message.get_attachments(),
         [{
             "loci": [[4, 0]],
             "type": "mentions",
             "user_ids": ["user_id_here"]
         }],
     )
 def test_visible(self) -> None:
     message = "Test " + RefAttach("user_id_here", "@all")
     self.assertEqual(message.get_text(), "Test @all")
     self.assertEqual(
         message.get_attachments(),
         [{
             "loci": [[5, 4]],
             "type": "mentions",
             "user_ids": ["user_id_here"]
         }],
     )
    def test_dynamic_creation(self) -> None:
        message = "Hello, " + RefAttach("user_id_here", "@world")

        self.assertEqual(message.get_text(), "Hello, @world")
        self.assertEqual(
            message.get_attachments(),
            [{
                "loci": [[7, 6]],
                "type": "mentions",
                "user_ids": ["user_id_here"]
            }],
        )
Esempio n. 17
0
    def save_seats_message(self, message: Message):
        user_id_map = {m.user_id: m.nickname for m in self.bot.bot.group.members}

        attachments: List[RefAttach] = []
        for user_id in message.favorited_by:
            if user_id in user_id_map:
                attachments.append(RefAttach(user_id, f'@{user_id_map[user_id]}'))

        if attachments:
            mes: Union[str, ComplexMessage] = "Save seats for:"
            for att in attachments:
                mes = mes + '\n  ' + att
            self.bot.post_message(mes)
    def test_manual_creation(self) -> None:
        message = ComplexMessage(
            ["Hello, ", RefAttach("user_id_here", "@world")])

        self.assertEqual(message.get_text(), "Hello, @world")
        self.assertEqual(
            message.get_attachments(),
            [{
                "loci": [[7, 6]],
                "type": "mentions",
                "user_ids": ["user_id_here"]
            }],
        )
 def test_complex_message(self) -> None:
     message = ComplexMessage(
         ["Hello, ", RefAttach("user_id_here", "@world")])
     text, attachments = smart_split_complex_message(message)
     self.assertEqual(text, "Hello, @world")
     self.assertEqual(
         attachments,
         [{
             "loci": [[7, 6]],
             "type": "mentions",
             "user_ids": ["user_id_here"]
         }],
     )
Esempio n. 20
0
def mars(bot: Bot,
         message: Message,
         chances: float = PICTURE_RESPONSE_CHANCE) -> bool:
    """
    Sends a message about mars if a user posts an image
    """
    for attachment in message.attachments:
        if attachment['type'] == 'image' and random.random() < chances:
            user_attach = RefAttach(message.user_id, f'@{message.name}')
            response = random.choice(PICTURE_RESPONSES)
            bot.post(response[:-1] + ", " + user_attach + response[-1])
            return True

    return False
Esempio n. 21
0
def get_quip(message: Message) -> Optional[Union[ComplexMessage, str]]:
    matches = []
    for word in re.split(r'[^a-zA-Z]', message.text):
        if word.strip().lower() in matching_words:
            matches.append(word.strip().lower())
    if matches:
        match = max(matches, key=str.__len__)
        quip = random.choice(list(quips.keys()))
        emoji = random.choice(quips[quip])
        split_quip = quip.format(match=match).split('<person>')
        if len(split_quip) > 1:
            user_ref = RefAttach(message.user_id, f'@{message.name}')
            return split_quip[0] + user_ref + split_quip[1] + ' ' + emoji
        else:
            return split_quip[0] + ' ' + emoji
    return None
 def test_mixing_together(self) -> None:
     message = (RefAttach("user1") + ImageAttach("http://image.url") +
                LocationAttach("home", 32, 83) + SplitAttach("token") +
                EmojiAttach(13, 9) + QueuedAttach("queue", "url") +
                LinkedImageAttach("linked_image_url"))
     self.assertEqual(message.get_text(),
                      "hometoken\ufffdqueuelinked_image_url")
     self.assertEqual(
         message.get_attachments(),
         [
             {
                 "type": "mentions",
                 "loci": [[0, 0]],
                 "user_ids": ["user1"]
             },
             {
                 "type": "image",
                 "url": "http://image.url"
             },
             {
                 "type": "location",
                 "name": "home",
                 "lat": 32,
                 "long": 83
             },
             {
                 "type": "split",
                 "token": "token"
             },
             {
                 "type": "emoji",
                 "charmap": [[13, 9]],
                 "placeholder": "\ufffd"
             },
             {
                 "queues": ["url", "linked_image"],
                 "type": "postprocessing"
             },
         ],
     )
     self.assertEqual(message.just_str(), "")
     self.assertEqual(
         str(message),
         "[R:, I:, L:home, S:token, E:�, Q: queue, Q: linked_image_url]",
     )
Esempio n. 23
0
 def on_fields_loaded(self):
     if self.text is None:
         self.text = ""
     from lowerpines.message import ComplexMessage, RefAttach
     self.complex_text = ComplexMessage('')
     doing_mentions = False
     for attachment in self.attachments:
         if attachment['type'] == 'mentions':
             doing_mentions = True
             prev_index = 0
             for i in range(len(self.text)):
                 for loci, user_id in zip(attachment['loci'],
                                          attachment['user_ids']):
                     if loci[0] == i:
                         self.complex_text += self.text[prev_index:loci[0]] + \
                                                 RefAttach(user_id, self.text[loci[0]:loci[0] + loci[1]])
                         prev_index = loci[0] + loci[1]
             self.complex_text = self.complex_text + self.text[prev_index:]
     if not doing_mentions:
         self.complex_text = ComplexMessage(self.text)
Esempio n. 24
0
def save_saucer_id(bot: Bot, message: Message, match) -> None:
    """
    Save a person's saucer ID, so we can lookup tasted beers later
    """
    saucer_id = match.group('saucer_id')

    tasted_beers = get_tasted_brews(saucer_id)

    if not tasted_beers:
        bot.post(f"Hmmm, it looks like {saucer_id} isn't a valid Saucer ID.")
        return

    # Otherwise it's valid.  Just update or create
    _, created = SaucerUser.objects.update_or_create(groupme_id=message.user_id,
                                                     defaults={'saucer_id': saucer_id})

    user_attach = RefAttach(message.user_id, f'@{message.name}')

    action = 'saved' if created else 'updated'

    bot.post("Thanks, " + user_attach + f"!  I {action} your Saucer ID.")
Esempio n. 25
0
    def on_fields_loaded(self) -> None:
        if self.text is None:
            self.text = ""
        from lowerpines.message import ComplexMessage, RefAttach  # noqa: F811

        self.complex_text = ComplexMessage("")
        doing_mentions = False
        for attachment in self.attachments:
            if attachment["type"] == "mentions":
                doing_mentions = True
                prev_index = 0
                for i in range(len(self.text)):
                    for loci, user_id in zip(attachment["loci"],
                                             attachment["user_ids"]):
                        if loci[0] == i:
                            self.complex_text += self.text[
                                prev_index:loci[0]] + RefAttach(
                                    user_id,
                                    self.text[loci[0]:loci[0] + loci[1]])
                            prev_index = loci[0] + loci[1]
                self.complex_text = self.complex_text + self.text[prev_index:]
        if not doing_mentions:
            self.complex_text = ComplexMessage(self.text)
 def test_forward_add(self) -> None:
     message = RefAttach("user_id", "@test") + ComplexMessage(", whats up?")
     self.assertEqual(message.get_text(), "@test, whats up?")
 def test_str_func(self) -> None:
     message = "test str " + RefAttach("user_id", "with attachment")
     self.assertEqual(
         str(message),
         str(["test str ",
              RefAttach("user_id", "with attachment")]))
Esempio n. 28
0
def get_member(bot: Bot, member_id: str) -> Union[RefAttach, None]:
    for member in bot.group.members:
        if member.user_id == member_id:
            return RefAttach(member_id, f'@{member.nickname}')
    return None