Move to basic client/server structure.
This commit is contained in:
@@ -1,10 +1,11 @@
|
|||||||
import sys
|
|
||||||
import os.path
|
import os.path
|
||||||
|
import sys
|
||||||
|
|
||||||
# Add current directory to python path
|
# Add current directory to python path
|
||||||
path = os.path.realpath(os.path.abspath(__file__))
|
path = os.path.realpath(os.path.abspath(__file__))
|
||||||
sys.path.insert(0, os.path.dirname(path))
|
sys.path.insert(0, os.path.dirname(path))
|
||||||
|
|
||||||
from dsst_gtk3 import gtk_ui
|
import gtk_ui
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
gtk_ui.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')
|
gi.require_version('Gtk', '3.0')
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from dsst_sql import sql
|
import sql
|
||||||
from dsst_gtk3 import util
|
from dsst_gtk3 import util
|
||||||
|
|
||||||
|
|
||||||
@@ -1,10 +1,13 @@
|
|||||||
import gi
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
import gi
|
||||||
|
|
||||||
gi.require_version('Gtk', '3.0')
|
gi.require_version('Gtk', '3.0')
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
from dsst_gtk3.handlers import handlers
|
from dsst_gtk3.handlers import handlers
|
||||||
from dsst_gtk3 import util, reload
|
from dsst_gtk3 import util, reload
|
||||||
from dsst_sql import sql, sql_func
|
import sql_func
|
||||||
|
import sql
|
||||||
|
|
||||||
|
|
||||||
class GtkUi:
|
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
|
import sql
|
||||||
from dsst_sql import sql
|
from dsst_gtk3 import dialogs
|
||||||
|
|
||||||
|
|
||||||
class BaseDataHandlers:
|
class BaseDataHandlers:
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
from dsst_gtk3 import dialogs, gtk_ui
|
|
||||||
|
from dsst_gtk3 import dialogs
|
||||||
|
|
||||||
|
|
||||||
class DeathHandlers:
|
class DeathHandlers:
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
from dsst_gtk3 import dialogs, util, gtk_ui
|
import sql
|
||||||
from dsst_sql import sql
|
from dsst_gtk3 import dialogs, util
|
||||||
|
|
||||||
|
|
||||||
class DialogHandlers:
|
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.dialog_handlers import DialogHandlers
|
||||||
from dsst_gtk3.handlers.death_handlers import DeathHandlers
|
from dsst_gtk3.handlers.death_handlers import DeathHandlers
|
||||||
from dsst_gtk3.handlers.victory_handlers import VictoryHandlers
|
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):
|
class Handlers(SeasonHandlers, BaseDataHandlers, DialogHandlers, DeathHandlers, VictoryHandlers):
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
from dsst_sql import sql
|
from data_access import sql
|
||||||
from dsst_gtk3 import dialogs, gtk_ui
|
from dsst_gtk3 import dialogs
|
||||||
|
|
||||||
|
|
||||||
class SeasonHandlers:
|
class SeasonHandlers:
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
from dsst_gtk3 import dialogs, gtk_ui
|
|
||||||
|
from dsst_gtk3 import dialogs
|
||||||
|
|
||||||
|
|
||||||
class VictoryHandlers:
|
class VictoryHandlers:
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
from collections import Counter
|
from collections import Counter
|
||||||
|
|
||||||
from gi.repository import Gtk
|
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
|
from dsst_gtk3 import util
|
||||||
|
|
||||||
|
|
||||||
@@ -114,3 +115,9 @@ def reload_episode_stats(builder: Gtk.Builder, app: 'gtk_ui.GtkUi', episode_id:
|
|||||||
if sorted_list:
|
if sorted_list:
|
||||||
enemy_name, deaths = sorted_list[0]
|
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
|
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:
|
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