Ejemplo n.º 1
0
    def iterate(self):
        packet = self.read_packet()
        if packet:
            if isinstance(packet, server_packets.PrivateMessage):
                self.handle_private_message(packet)
            elif isinstance(packet, server_packets.PublicChannelJoined):
                # set org id and org name
                if packet.channel_id >> 32 == 3:
                    self.org_id = 0x00ffffffff & packet.channel_id
                    if packet.name != "Clan (name unknown)":
                        self.org_name = packet.name
            elif isinstance(packet, server_packets.SystemMessage):
                try:
                    category_id = 20000
                    instance_id = packet.message_id
                    template = self.mmdb_parser.get_message_string(
                        category_id, instance_id)
                    params = self.mmdb_parser.parse_params(packet.message_args)
                    packet.extended_message = ExtendedMessage(
                        category_id, instance_id, template, params)
                    self.logger.log_chat("SystemMessage", None,
                                         packet.extended_message.get_message())
                except Exception as e:
                    self.logger.error("", e)
            elif isinstance(packet, server_packets.PublicChannelMessage):
                msg = packet.message
                if msg.startswith("~&") and msg.endswith("~"):
                    msg = msg[2:-1]
                    try:
                        category_id = self.mmdb_parser.read_base_85(msg[0:5])
                        instance_id = self.mmdb_parser.read_base_85(msg[5:10])
                        template = self.mmdb_parser.get_message_string(
                            category_id, instance_id)
                        params = self.mmdb_parser.parse_params(msg[10:])
                        packet.extended_message = ExtendedMessage(
                            category_id, instance_id, template, params)
                    except Exception as e:
                        self.logger.error("", e)

            for handler in self.packet_handlers.get(packet.id, []):
                handler(packet)

            self.event_manager.fire_event("packet:" + str(packet.id), packet)

        # check packet queue for outgoing packets
        outgoing_packet = self.packet_queue.dequeue()
        while outgoing_packet:
            self.send_packet(outgoing_packet)
            outgoing_packet = self.packet_queue.dequeue()

        return packet
Ejemplo n.º 2
0
    def test_get_victory_event(self):
        tower_messages_controller = TowerMessagesController()

        packet1 = PublicChannelMessage(
            42949672962, 0, 'Notum Wars Update: Victory to the Clans!!!',
            '\x02\x01')
        victory_event1 = tower_messages_controller.get_victory_event(packet1)
        self.assertIsNone(victory_event1)

        packet2 = PublicChannelMessage(
            42949672962, 0,
            "The Neutral organization Test Org Attacker attacked the Neutral Test Org Defender at their base in Varmint Woods. The attackers won!!",
            "\x02\x01")
        victory_event2 = tower_messages_controller.get_victory_event(packet2)
        self.assertEqual(
            {
                'type': 'attack',
                'timestamp': victory_event2["timestamp"],
                'winner': {
                    'faction': 'Neutral',
                    'org_name': 'Test Org Attacker'
                },
                'loser': {
                    'faction': 'Neutral',
                    'org_name': 'Test Org Defender'
                },
                'location': {
                    'playfield': {
                        'long_name': 'Varmint Woods'
                    }
                }
            }, victory_event2)

        packet3 = PublicChannelMessage(
            42949672962, 0,
            '~&!!!&r#g1+3R!!!8S!!!!#s\x11Test Organization\x0cOmni Forest~',
            '\x02\x01')
        packet3.extended_message = ExtendedMessage(
            506, 147506468,
            'Notum Wars Update: The %s organization %s lost their base in %s.',
            ['omni', 'Test Organization', 'Omni Forest'])
        victory_event3 = tower_messages_controller.get_victory_event(packet3)
        self.assertEqual(
            {
                'type': 'terminated',
                'timestamp': victory_event3["timestamp"],
                'winner': {
                    'faction': 'Omni',
                    'org_name': 'Test Organization'
                },
                'loser': {
                    'faction': 'Omni',
                    'org_name': 'Test Organization'
                },
                'location': {
                    'playfield': {
                        'long_name': 'Omni Forest'
                    }
                }
            }, victory_event3)
Ejemplo n.º 3
0
    def test_get_attack_event(self):
        tower_messages_controller = TowerMessagesController()

        packet1 = PublicChannelMessage(
            42949672960, 0,
            "Tyrence just attacked the neutral organization Test Org's tower in Varmint Woods at location (123, 456).\n",
            "")

        attack_event1 = tower_messages_controller.get_attack_event(packet1)
        self.assertEqual(
            {
                'timestamp': attack_event1["timestamp"],
                'attacker': {
                    'name': 'Tyrence',
                    'faction': '',
                    'org_name': ''
                },
                'defender': {
                    'faction': 'Neutral',
                    'org_name': 'Test Org'
                },
                'location': {
                    'playfield': {
                        'long_name': 'Varmint Woods'
                    },
                    'x_coord': '123',
                    'y_coord': '456'
                }
            }, attack_event1)

        packet2 = PublicChannelMessage(42949672960, 0, "", "")
        # The %s organization %s just entered a state of war! %s attacked the %s organization %s's tower in %s at location (%d,%d)
        params = [
            "Neutral", "NeutOrg", "Tyrence", "Neutral", "Test Org",
            "Varmint Woods", "123", "456"
        ]
        packet2.extended_message = ExtendedMessage(506, 12753364, "", params)
        attack_event2 = tower_messages_controller.get_attack_event(packet2)
        self.assertEqual(
            {
                'timestamp': attack_event2["timestamp"],
                'attacker': {
                    'name': 'Tyrence',
                    'faction': 'Neutral',
                    'org_name': 'NeutOrg'
                },
                'defender': {
                    'faction': 'Neutral',
                    'org_name': 'Test Org'
                },
                'location': {
                    'playfield': {
                        'long_name': 'Varmint Woods'
                    },
                    'x_coord': '123',
                    'y_coord': '456'
                }
            }, attack_event2)
Ejemplo n.º 4
0
 def handle_public_channel_message(
         self, packet: server_packets.PublicChannelMessage):
     if packet.channel_id == self.TOWER_BATTLE_OUTCOME_ID:
         print("tower battle outcome", packet)
     elif packet.channel_id == self.ALL_TOWERS_ID:
         print("tower attack", packet)
         msg = packet.message
         if msg.startswith("~&") and msg.endswith("~"):
             msg = msg[1:-2]
             category_id = self.mmdb.read_base_85(msg[0:5])
             instance_id = self.mmdb.read_base_85(msg[5:10])
             template = self.mmdb.get_message_string(
                 category_id, instance_id)
             params = self.mmdb.parse_params(msg[10:])
             extended_message = ExtendedMessage(category_id, instance_id,
                                                template, params)
             print(extended_message)
             print(extended_message.get_message())
             self.event_manager.fire_event("tower_attack", extended_message)
         else:
             raise Exception("Tower message not an extended message")
Ejemplo n.º 5
0
    def system_message_ext_msg_handling(self, packet: server_packets.SystemMessage):
        try:
            category_id = 20000
            instance_id = packet.message_id
            template = self.mmdb_parser.get_message_string(category_id, instance_id)
            params = self.mmdb_parser.parse_params(packet.message_args)
            packet.extended_message = ExtendedMessage(category_id, instance_id, template, params)
            self.logger.log_chat("SystemMessage", None, packet.extended_message.get_message())
        except Exception as e:
            self.logger.error("Error handling extended message: " + str(packet), e)

        return packet
Ejemplo n.º 6
0
    def public_channel_message_ext_msg_handling(self, packet: server_packets.PublicChannelMessage):
        msg = packet.message
        if msg.startswith("~&") and msg.endswith("~"):
            try:
                msg = msg[2:-1].encode("utf-8")
                category_id = self.mmdb_parser.read_base_85(msg[0:5])
                instance_id = self.mmdb_parser.read_base_85(msg[5: 10])
                template = self.mmdb_parser.get_message_string(category_id, instance_id)
                params = self.mmdb_parser.parse_params(msg[10:])
                packet.extended_message = ExtendedMessage(category_id, instance_id, template, params)
            except Exception as e:
                self.logger.error("Error handling extended message for packet: " + str(packet), e)

        return packet