1
0

feat: make sniffing async

This commit is contained in:
2026-06-01 23:20:29 +08:00
parent 48b69b7775
commit 3aacb2c32d
4 changed files with 24 additions and 12 deletions
+4 -1
View File
@@ -1,7 +1,8 @@
import logging import logging
from signal import pause
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from star_resonance_tracer.proto.enum_chit_chat_channel_type_pb2 import ChitChatChannelType from star_resonance_tracer.proto.enum_chit_chat_channel_type_pb2 import ChitChatChannelType
from inventory_wars.game import Game 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 = Game(Session(engine), item_id=1040202, listening_channels=[ChitChatChannelType.ChannelTeam])
game.start() game.start()
pause()
+8 -4
View File
@@ -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.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.proto.stru_place_holder_item_pb2 import PlaceHolderItem
from star_resonance_tracer.sniffer import Sniffer from star_resonance_tracer.sniffer import Sniffer
from inventory_wars.const import ChitChatNtf, decode_placeholder, HypertextVariant from inventory_wars.const import ChitChatNtf, decode_placeholder, HypertextVariant
from inventory_wars.sniffer import start_sniffing from inventory_wars.sniffer import get_sniffer
from star_resonance_tracer.proto.serv_chit_chat_ntf_pb2 import ChitChatNtf as ChitChatNtfPb
def on_chit_chat_msg(event: ChitChatNtfPb.NotifyNewestChitChatMsgs) -> None: def on_chit_chat_msg(event: ChitChatNtfPb.NotifyNewestChitChatMsgs) -> None:
@@ -24,7 +26,6 @@ def on_chit_chat_msg(event: ChitChatNtfPb.NotifyNewestChitChatMsgs) -> None:
print(item) print(item)
sniffer = Sniffer() sniffer = Sniffer()
sniffer.set_service_type( sniffer.set_service_type(
ChitChatNtf.ServiceId.value, ChitChatNtf.ServiceId.value,
@@ -33,4 +34,7 @@ sniffer.set_service_type(
) )
sniffer.on_service(ChitChatNtfPb.NotifyNewestChitChatMsgs, on_chit_chat_msg) sniffer.on_service(ChitChatNtfPb.NotifyNewestChitChatMsgs, on_chit_chat_msg)
start_sniffing(sniffer) scapy = get_sniffer(sniffer)
scapy.start()
pause()
+8 -2
View File
@@ -1,5 +1,6 @@
from datetime import datetime from datetime import datetime
from scapy.sendrecv import AsyncSniffer
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
import logging 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_channel_type_pb2 import ChitChatChannelType
from star_resonance_tracer.proto.enum_chit_chat_msg_type_pb2 import ChitChatMsgType 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__) logger = logging.getLogger(__name__)
@@ -22,6 +23,7 @@ class Game:
self.session = session self.session = session
self.listening_channels = listening_channels or [] self.listening_channels = listening_channels or []
self.event = Event(item_id=item_id) self.event = Event(item_id=item_id)
self.scapy: AsyncSniffer | None = None
def start(self) -> None: def start(self) -> None:
self.event.timestamp = datetime.now() self.event.timestamp = datetime.now()
@@ -39,7 +41,11 @@ class Game:
) )
sniffer.on_service(ChitChatNtfPb.NotifyNewestChitChatMsgs, self.on_chit_chat_msg) 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: def on_chit_chat_msg(self, event: ChitChatNtfPb.NotifyNewestChitChatMsgs) -> None:
req = event.vRequest req = event.vRequest
+4 -5
View File
@@ -1,5 +1,4 @@
import logging import logging
import os
from star_resonance_tracer.sniffer import Sniffer from star_resonance_tracer.sniffer import Sniffer
from star_resonance_tracer.connection import Connection, PidBasedConnectionDetector from star_resonance_tracer.connection import Connection, PidBasedConnectionDetector
@@ -8,17 +7,17 @@ from collections import defaultdict
from scapy.config import conf from scapy.config import conf
from scapy.layers.inet import TCP, IP from scapy.layers.inet import TCP, IP
from scapy.packet import Packet, Raw from scapy.packet import Packet, Raw
from scapy.sendrecv import sniff from scapy.sendrecv import AsyncSniffer
__all__ = ( __all__ = (
"start_sniffing", "get_sniffer",
) )
conf.layers.filter([TCP, IP]) conf.layers.filter([TCP, IP])
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def start_sniffing(sniffer: Sniffer) -> None: def get_sniffer(sniffer: Sniffer) -> AsyncSniffer:
executable_name = "StarSEA" executable_name = "StarSEA"
detector = PidBasedConnectionDetector() detector = PidBasedConnectionDetector()
@@ -48,4 +47,4 @@ def start_sniffing(sniffer: Sniffer) -> None:
except Exception: except Exception:
logger.exception("Silently caught 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)