NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

messenger.py (5733B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\chat\client\local_chat\messenger.py
      2 import uthread2
      3 from chat.common.const import MemberClassification
      4 from stackless_response_router.exceptions import TimeoutException
      5 from signals import Signal
      6 import logging
      7 from eveProto.generated.eve_public.chat.local.api.requests_pb2 import BroadcastMessageRequest, BroadcastMessageResponse, GetMembershipListRequest, GetMembershipListResponse
      8 from eveProto.generated.eve_public.chat.local.api.notices_pb2 import MembershipListNotice, MembershipRefreshedNotice, JoinNotice, LeaveNotice, MessageBroadcastNotice
      9 from eveProto.generated.eve_public.chat.local.local_pb2 import Classification
     10 CLASSIFICATION_RESOLVER = {Classification.CLASSIFICATION_UNSPECIFIED: MemberClassification.UNSPECIFIED,
     11  Classification.CLASSIFICATION_INVISIBLE: MemberClassification.INVISIBLE,
     12  Classification.CLASSIFICATION_DEVELOPER: MemberClassification.DEVELOPER,
     13  Classification.CLASSIFICATION_ADMINISTRATOR: MemberClassification.ADMINISTRATOR,
     14  Classification.CLASSIFICATION_GAMEMASTER: MemberClassification.GAME_MASTER,
     15  Classification.CLASSIFICATION_VOLUNTEER: MemberClassification.VOLUNTEER,
     16  Classification.CLASSIFICATION_NPC: MemberClassification.NPC}
     17 from eveProto.generated.eve_public.chat.local.api.admin.requests_pb2 import MuteRequest, MuteResponse
     18 on_message_broadcast_notice = Signal('local_chat.on_message_broadcast_notice')
     19 on_exit_notice = Signal('local_chat.on_exit_notice')
     20 on_membership_list_notice = Signal('local_chat.on_membership_list_notice')
     21 on_membership_refreshed_notice = Signal('local_chat.on_membership_refreshed_notice')
     22 on_join_notice = Signal('local_chat.on_join_notice')
     23 logger = logging.getLogger('chat')
     24 
     25 class LocalChatMessenger(object):
     26     _instance = None
     27     public_gateway_svc = None
     28 
     29     @classmethod
     30     def get_instance(cls, public_gateway):
     31         if not cls._instance:
     32             cls._instance = LocalChatMessenger(public_gateway)
     33         return cls._instance
     34 
     35     def __init__(self, public_gateway):
     36         self.public_gateway_svc = public_gateway
     37         self.public_gateway_svc.subscribe_to_notice(MessageBroadcastNotice, self.on_message_broadcast_notice)
     38         self.public_gateway_svc.subscribe_to_notice(LeaveNotice, self.on_exit_notice)
     39         self.public_gateway_svc.subscribe_to_notice(MembershipListNotice, self.on_membership_list_notice)
     40         self.public_gateway_svc.subscribe_to_notice(MembershipRefreshedNotice, self.on_membership_refreshed_notice)
     41         self.public_gateway_svc.subscribe_to_notice(JoinNotice, self.on_join_notice)
     42 
     43     def on_join_notice(self, payload, _primitive):
     44         on_join_notice(payload.solar_system.sequential, payload.member.character.sequential, self._format_member_data(payload.member))
     45 
     46     def on_exit_notice(self, payload, _primitive):
     47         on_exit_notice(payload.solar_system.sequential, payload.character.sequential)
     48 
     49     def on_message_broadcast_notice(self, payload, _primitive):
     50         on_message_broadcast_notice(payload.solar_system.sequential, payload.author.sequential, payload.message)
     51 
     52     def on_membership_list_notice(self, payload, _primitive):
     53         solar_system_id = payload.solar_system.sequential
     54         members = self.parse_members_from_payload(payload)
     55         on_membership_list_notice(solar_system_id, members)
     56 
     57     def on_membership_refreshed_notice(self, payload, _primitive):
     58         solar_system_id = payload.solar_system.sequential
     59         member_id = payload.member.character.sequential
     60         member_data = self._format_member_data(payload.member)
     61         on_membership_refreshed_notice(solar_system_id, member_id, member_data)
     62 
     63     def broadcast_message(self, message_content, response_callback, timeout_callback):
     64         request = BroadcastMessageRequest()
     65         request.message = message_content
     66         uthread2.StartTasklet(self.process_async_request, request, BroadcastMessageResponse, response_callback, timeout_callback)
     67 
     68     def request_solar_system_membership(self, response_callback, timeout_callback):
     69         request = GetMembershipListRequest()
     70         uthread2.StartTasklet(self.process_async_request, request, GetMembershipListResponse, response_callback, timeout_callback)
     71 
     72     def process_async_request(self, request, response_class, response_callback, timeout_callback):
     73         request_primitive = None
     74         try:
     75             request_primitive, response_channel = self.public_gateway_svc.send_character_request(request, response_class)
     76             response_primitive, payload = response_channel.receive()
     77             response_callback(payload, response_primitive)
     78         except TimeoutException as e:
     79             timeout_callback(e, request_primitive)
     80         except Exception as e:
     81             logger.exception(e)
     82             response_callback(None, None)
     83 
     84     def parse_members_from_payload(self, payload):
     85         return {member.character.sequential:self._format_member_data(member) for member in payload.members}
     86 
     87     def _format_member_data(self, member):
     88         return {'corporation_id': member.corporation.sequential,
     89          'alliance_id': member.alliance.sequential if member.HasField('alliance') else None,
     90          'war_faction_id': member.faction.sequential if member.HasField('faction') else None,
     91          'classification': CLASSIFICATION_RESOLVER[member.classification]}
     92 
     93     def mute_player(self, character_id, duration, reason, response_callback, timeout_callback):
     94         request = MuteRequest()
     95         request.character.sequential = character_id
     96         request.duration.seconds = duration
     97         request.reason = reason
     98         uthread2.StartTasklet(self.process_async_request, request, MuteResponse, response_callback, timeout_callback)