Move to basic client/server structure.
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
import sys
|
||||
import os.path
|
||||
import sys
|
||||
|
||||
# Add current directory to python path
|
||||
path = os.path.realpath(os.path.abspath(__file__))
|
||||
sys.path.insert(0, os.path.dirname(path))
|
||||
|
||||
from dsst_gtk3 import gtk_ui
|
||||
import gtk_ui
|
||||
|
||||
if __name__ == '__main__':
|
||||
gtk_ui.main()
|
||||
77
dsst/common/models.py
Normal file
77
dsst/common/models.py
Normal file
@@ -0,0 +1,77 @@
|
||||
class Season:
|
||||
def __init__(self, arg={}):
|
||||
self.id = arg.get('id')
|
||||
self.number = arg.get('number')
|
||||
self.game_name = arg.get('game_name')
|
||||
self.start_date = arg.get('start_date')
|
||||
self.end_date = arg.get('end_date')
|
||||
|
||||
self.episodes = arg.get('episodes')
|
||||
self.enemies = arg.get('enemies')
|
||||
|
||||
|
||||
class Player:
|
||||
def __init__(self, arg={}):
|
||||
self.id = arg.get('id')
|
||||
self.name = arg.get('name')
|
||||
self.hex_id = arg.get('hex_id')
|
||||
|
||||
self.deaths = arg.get('deaths')
|
||||
self.victories = arg.get('victories')
|
||||
self.penalties = arg.get('penalties')
|
||||
|
||||
|
||||
class Episode:
|
||||
def __init__(self, arg={}):
|
||||
self.id = arg.get('id')
|
||||
self.seq_number = arg.get('seq_number')
|
||||
self.number = arg.get('number')
|
||||
self.name = arg.get('name')
|
||||
self.date = arg.get('date')
|
||||
self.season = arg.get('season')
|
||||
self.players = arg.get('players')
|
||||
self.deaths = arg.get('deaths')
|
||||
self.victories = arg.get('victories')
|
||||
|
||||
|
||||
class Drink:
|
||||
def __init__(self, arg={}):
|
||||
self.id = arg.get('id')
|
||||
self.name = arg.get('name')
|
||||
self.vol = arg.get('vol')
|
||||
|
||||
|
||||
class Enemy:
|
||||
def __init__(self, arg={}):
|
||||
self.id = arg.get('id')
|
||||
self.name = arg.get('name')
|
||||
self.optional = arg.get('optional')
|
||||
self.season = arg.get('season')
|
||||
|
||||
|
||||
class Death:
|
||||
def __init__(self, arg={}):
|
||||
self.id = arg.get('id')
|
||||
self.info = arg.get('info')
|
||||
self.player = arg.get('player')
|
||||
self.enemy = arg.get('enemy')
|
||||
self.episode = arg.get('episode')
|
||||
self.penalties = arg.get('penalties')
|
||||
|
||||
|
||||
class Penalty:
|
||||
def __init__(self, arg={}):
|
||||
self.id = arg.get('id')
|
||||
self.size = arg.get('size')
|
||||
self.drink = arg.get('drink')
|
||||
self.player = arg.get('player')
|
||||
self.death = arg.get('death')
|
||||
|
||||
|
||||
class Victory:
|
||||
def __init__(self, arg={}):
|
||||
self.id = arg.get('id')
|
||||
self.info = arg.get('info')
|
||||
self.player = arg.get('player')
|
||||
self.enemy = arg.get('enemy')
|
||||
self.episode = arg.get('episode')
|
||||
28
dsst/common/util.py
Normal file
28
dsst/common/util.py
Normal file
@@ -0,0 +1,28 @@
|
||||
import struct
|
||||
|
||||
|
||||
def send_msg(sock, msg):
|
||||
# Prefix each message with a 4-byte length (network byte order)
|
||||
msg = struct.pack('>I', len(msg)) + msg
|
||||
sock.sendall(msg)
|
||||
|
||||
|
||||
def recv_msg(sock):
|
||||
# Read message length and unpack it into an integer
|
||||
raw_msglen = recvall(sock, 4)
|
||||
if not raw_msglen:
|
||||
return None
|
||||
msglen = struct.unpack('>I', raw_msglen)[0]
|
||||
# Read the message data
|
||||
return recvall(sock, msglen)
|
||||
|
||||
|
||||
def recvall(sock, n):
|
||||
# Helper function to recv n bytes or return None if EOF is hit
|
||||
data = b''
|
||||
while len(data) < n:
|
||||
packet = sock.recv(n - len(data))
|
||||
if not packet:
|
||||
return None
|
||||
data += packet
|
||||
return data
|
||||
28
dsst/dsst_client/client.py
Normal file
28
dsst/dsst_client/client.py
Normal file
@@ -0,0 +1,28 @@
|
||||
import socket
|
||||
|
||||
try:
|
||||
import cPickcle as pickle
|
||||
except ImportError:
|
||||
print('cPickle package not installed, falling back to pickle')
|
||||
import pickle
|
||||
|
||||
from common import util, models
|
||||
|
||||
PORT = 12345
|
||||
HOST = 'europa'
|
||||
BUFFER_SIZE = 1024
|
||||
|
||||
s = socket.socket()
|
||||
s.connect((HOST, PORT))
|
||||
|
||||
try:
|
||||
data = 'get_dummy'
|
||||
message = pickle.dumps(data)
|
||||
util.send_msg(s, message)
|
||||
response = util.recv_msg(s)
|
||||
result = pickle.loads(response)
|
||||
print(result, result.__dict__)
|
||||
|
||||
finally:
|
||||
s.close()
|
||||
|
||||
@@ -5,7 +5,7 @@ import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
from datetime import datetime
|
||||
from dsst_sql import sql
|
||||
import sql
|
||||
from dsst_gtk3 import util
|
||||
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
import gi
|
||||
import os
|
||||
|
||||
import gi
|
||||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
from dsst_gtk3.handlers import handlers
|
||||
from dsst_gtk3 import util, reload
|
||||
from dsst_sql import sql, sql_func
|
||||
import sql_func
|
||||
import sql
|
||||
|
||||
|
||||
class GtkUi:
|
||||
0
dsst/dsst_client/dsst_gtk3/handlers/__init__.py
Normal file
0
dsst/dsst_client/dsst_gtk3/handlers/__init__.py
Normal file
@@ -1,5 +1,5 @@
|
||||
from dsst_gtk3 import dialogs, gtk_ui
|
||||
from dsst_sql import sql
|
||||
import sql
|
||||
from dsst_gtk3 import dialogs
|
||||
|
||||
|
||||
class BaseDataHandlers:
|
||||
@@ -1,5 +1,6 @@
|
||||
from gi.repository import Gtk
|
||||
from dsst_gtk3 import dialogs, gtk_ui
|
||||
|
||||
from dsst_gtk3 import dialogs
|
||||
|
||||
|
||||
class DeathHandlers:
|
||||
@@ -1,5 +1,5 @@
|
||||
from dsst_gtk3 import dialogs, util, gtk_ui
|
||||
from dsst_sql import sql
|
||||
import sql
|
||||
from dsst_gtk3 import dialogs, util
|
||||
|
||||
|
||||
class DialogHandlers:
|
||||
@@ -6,7 +6,8 @@ from dsst_gtk3.handlers.base_data_handlers import BaseDataHandlers
|
||||
from dsst_gtk3.handlers.dialog_handlers import DialogHandlers
|
||||
from dsst_gtk3.handlers.death_handlers import DeathHandlers
|
||||
from dsst_gtk3.handlers.victory_handlers import VictoryHandlers
|
||||
from dsst_sql import sql, sql_func
|
||||
import sql_func
|
||||
import sql
|
||||
|
||||
|
||||
class Handlers(SeasonHandlers, BaseDataHandlers, DialogHandlers, DeathHandlers, VictoryHandlers):
|
||||
@@ -1,5 +1,5 @@
|
||||
from dsst_sql import sql
|
||||
from dsst_gtk3 import dialogs, gtk_ui
|
||||
from data_access import sql
|
||||
from dsst_gtk3 import dialogs
|
||||
|
||||
|
||||
class SeasonHandlers:
|
||||
@@ -1,5 +1,6 @@
|
||||
from gi.repository import Gtk
|
||||
from dsst_gtk3 import dialogs, gtk_ui
|
||||
|
||||
from dsst_gtk3 import dialogs
|
||||
|
||||
|
||||
class VictoryHandlers:
|
||||
@@ -1,7 +1,8 @@
|
||||
from collections import Counter
|
||||
|
||||
from gi.repository import Gtk
|
||||
from dsst_gtk3 import gtk_ui
|
||||
from dsst_sql import sql, sql_func
|
||||
|
||||
from data_access import sql, sql_func
|
||||
from dsst_gtk3 import util
|
||||
|
||||
|
||||
@@ -113,4 +114,10 @@ def reload_episode_stats(builder: Gtk.Builder, app: 'gtk_ui.GtkUi', episode_id:
|
||||
sorted_list = Counter(enemy_list).most_common(1)
|
||||
if sorted_list:
|
||||
enemy_name, deaths = sorted_list[0]
|
||||
builder.get_object('ep_enemy_name_label').set_text(f'{enemy_name} ({deaths} Deaths)')
|
||||
builder.get_object('ep_enemy_name_label').set_text(f'{enemy_name} ({deaths} Deaths)')
|
||||
|
||||
|
||||
def fill_list_store(store: Gtk.ListStore, models: list):
|
||||
store.clear()
|
||||
for model in models:
|
||||
pass
|
||||
0
dsst/dsst_server/__init__.py
Normal file
0
dsst/dsst_server/__init__.py
Normal file
0
dsst/dsst_server/data_access/__init__.py
Normal file
0
dsst/dsst_server/data_access/__init__.py
Normal file
@@ -1,7 +1,7 @@
|
||||
"""
|
||||
This module contains shorthand functions for common queries to ease access from the UI
|
||||
"""
|
||||
from dsst_sql.sql import *
|
||||
from data_access.sql import *
|
||||
|
||||
|
||||
def get_episodes_for_season(season_id: int) -> list:
|
||||
42
dsst/dsst_server/server.py
Normal file
42
dsst/dsst_server/server.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import pickle
|
||||
import socket
|
||||
|
||||
from data_access import sql
|
||||
from common import util, models
|
||||
|
||||
PORT = 12345
|
||||
HOST = socket.gethostname()
|
||||
BUFFER_SIZE = 1024
|
||||
|
||||
|
||||
class DsstServer:
|
||||
def __init__(self):
|
||||
self.socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
print('Created socket')
|
||||
|
||||
self.socket_server.bind((HOST, PORT))
|
||||
print(f'Bound socket to {PORT} on host {HOST}')
|
||||
|
||||
def run(self):
|
||||
self.socket_server.listen(5)
|
||||
print('Socket is listening')
|
||||
|
||||
while True:
|
||||
client, address = self.socket_server.accept()
|
||||
try:
|
||||
print(f'Connection from {address}')
|
||||
data = util.recv_msg(client)
|
||||
request = pickle.loads(data)
|
||||
print(f'Received data: {request}')
|
||||
dummy = models.Player()
|
||||
dummy.name = 'Player 1'
|
||||
dummy.hex_id = '0xC2'
|
||||
dummy.deaths = [1, 2, 3]
|
||||
util.send_msg(client, pickle.dumps(dummy))
|
||||
finally:
|
||||
client.close()
|
||||
print('Connection to client closed')
|
||||
|
||||
if __name__ == '__main__':
|
||||
server = DsstServer()
|
||||
server.run()
|
||||
Reference in New Issue
Block a user