diff --git a/scripts/example_game.py b/scripts/example_game.py index d77e49d..c82df3c 100644 --- a/scripts/example_game.py +++ b/scripts/example_game.py @@ -1,7 +1,8 @@ import logging +from signal import pause + from sqlalchemy import create_engine from sqlalchemy.orm import Session - from star_resonance_tracer.proto.enum_chit_chat_channel_type_pb2 import ChitChatChannelType from inventory_wars.game import Game @@ -14,3 +15,5 @@ Base.metadata.create_all(engine) game = Game(Session(engine), item_id=1040202, listening_channels=[ChitChatChannelType.ChannelTeam]) game.start() + +pause() diff --git a/scripts/sniff_items.py b/scripts/sniff_items.py index 65509f3..3a9b867 100644 --- a/scripts/sniff_items.py +++ b/scripts/sniff_items.py @@ -1,10 +1,12 @@ +from signal import pause + from star_resonance_tracer.proto.enum_chit_chat_msg_type_pb2 import ChitChatMsgType +from star_resonance_tracer.proto.serv_chit_chat_ntf_pb2 import ChitChatNtf as ChitChatNtfPb from star_resonance_tracer.proto.stru_place_holder_item_pb2 import PlaceHolderItem from star_resonance_tracer.sniffer import Sniffer from inventory_wars.const import ChitChatNtf, decode_placeholder, HypertextVariant -from inventory_wars.sniffer import start_sniffing -from star_resonance_tracer.proto.serv_chit_chat_ntf_pb2 import ChitChatNtf as ChitChatNtfPb +from inventory_wars.sniffer import get_sniffer def on_chit_chat_msg(event: ChitChatNtfPb.NotifyNewestChitChatMsgs) -> None: @@ -24,7 +26,6 @@ def on_chit_chat_msg(event: ChitChatNtfPb.NotifyNewestChitChatMsgs) -> None: print(item) - sniffer = Sniffer() sniffer.set_service_type( ChitChatNtf.ServiceId.value, @@ -33,4 +34,7 @@ sniffer.set_service_type( ) sniffer.on_service(ChitChatNtfPb.NotifyNewestChitChatMsgs, on_chit_chat_msg) -start_sniffing(sniffer) \ No newline at end of file +scapy = get_sniffer(sniffer) +scapy.start() + +pause() diff --git a/src/inventory_wars/game.py b/src/inventory_wars/game.py index 26ecf1c..bdc53fa 100644 --- a/src/inventory_wars/game.py +++ b/src/inventory_wars/game.py @@ -1,5 +1,6 @@ from datetime import datetime +from scapy.sendrecv import AsyncSniffer from sqlalchemy.orm import Session import logging @@ -12,7 +13,7 @@ from star_resonance_tracer.proto.serv_chit_chat_ntf_pb2 import ChitChatNtf as Ch from star_resonance_tracer.proto.enum_chit_chat_channel_type_pb2 import ChitChatChannelType from star_resonance_tracer.proto.enum_chit_chat_msg_type_pb2 import ChitChatMsgType -from inventory_wars.sniffer import start_sniffing +from inventory_wars.sniffer import get_sniffer logger = logging.getLogger(__name__) @@ -22,6 +23,7 @@ class Game: self.session = session self.listening_channels = listening_channels or [] self.event = Event(item_id=item_id) + self.scapy: AsyncSniffer | None = None def start(self) -> None: self.event.timestamp = datetime.now() @@ -39,7 +41,11 @@ class Game: ) sniffer.on_service(ChitChatNtfPb.NotifyNewestChitChatMsgs, self.on_chit_chat_msg) - start_sniffing(sniffer) + self.scapy = get_sniffer(sniffer) + self.scapy.start() + + def stop(self): + self.scapy.stop() def on_chit_chat_msg(self, event: ChitChatNtfPb.NotifyNewestChitChatMsgs) -> None: req = event.vRequest diff --git a/src/inventory_wars/sniffer.py b/src/inventory_wars/sniffer.py index cb3995f..625981e 100644 --- a/src/inventory_wars/sniffer.py +++ b/src/inventory_wars/sniffer.py @@ -1,5 +1,4 @@ import logging -import os from star_resonance_tracer.sniffer import Sniffer from star_resonance_tracer.connection import Connection, PidBasedConnectionDetector @@ -8,17 +7,17 @@ from collections import defaultdict from scapy.config import conf from scapy.layers.inet import TCP, IP from scapy.packet import Packet, Raw -from scapy.sendrecv import sniff +from scapy.sendrecv import AsyncSniffer __all__ = ( - "start_sniffing", + "get_sniffer", ) conf.layers.filter([TCP, IP]) logger = logging.getLogger(__name__) -def start_sniffing(sniffer: Sniffer) -> None: +def get_sniffer(sniffer: Sniffer) -> AsyncSniffer: executable_name = "StarSEA" detector = PidBasedConnectionDetector() @@ -48,4 +47,4 @@ def start_sniffing(sniffer: Sniffer) -> None: except Exception: logger.exception("Silently caught exception") - sniff(filter=detector.as_bpf_filter(), prn=on_packet, store=False) + return AsyncSniffer(filter=detector.as_bpf_filter(), prn=on_packet, store=False)