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)