From 8516650af49191fc9cec096a7bc5496758478084 Mon Sep 17 00:00:00 2001 From: luxick Date: Sat, 3 Mar 2018 14:36:41 +0100 Subject: [PATCH] Move to basic client/server structure. --- dsst/__main__.py | 5 +- dsst/{dsst_gtk3 => common}/__init__.py | 0 dsst/common/models.py | 77 +++++++++++++++++++ dsst/common/util.py | 28 +++++++ .../handlers => dsst_client}/__init__.py | 0 dsst/dsst_client/client.py | 28 +++++++ .../dsst_gtk3}/__init__.py | 0 dsst/{ => dsst_client}/dsst_gtk3/dialogs.py | 2 +- dsst/{ => dsst_client}/dsst_gtk3/gtk_ui.py | 7 +- .../dsst_gtk3/handlers/__init__.py | 0 .../dsst_gtk3/handlers/base_data_handlers.py | 4 +- .../dsst_gtk3/handlers/death_handlers.py | 3 +- .../dsst_gtk3/handlers/dialog_handlers.py | 4 +- .../dsst_gtk3/handlers/handlers.py | 3 +- .../dsst_gtk3/handlers/season_handlers.py | 4 +- .../dsst_gtk3/handlers/victory_handlers.py | 3 +- dsst/{ => dsst_client}/dsst_gtk3/reload.py | 13 +++- .../dsst_gtk3/resources/glade/dialogs.glade | 0 .../dsst_gtk3/resources/glade/window.glade | 0 dsst/{ => dsst_client}/dsst_gtk3/util.py | 0 dsst/dsst_server/__init__.py | 0 dsst/dsst_server/data_access/__init__.py | 0 .../data_access}/sql.py | 0 .../data_access}/sql_func.py | 2 +- dsst/dsst_server/server.py | 42 ++++++++++ 25 files changed, 207 insertions(+), 18 deletions(-) rename dsst/{dsst_gtk3 => common}/__init__.py (100%) create mode 100644 dsst/common/models.py create mode 100644 dsst/common/util.py rename dsst/{dsst_gtk3/handlers => dsst_client}/__init__.py (100%) create mode 100644 dsst/dsst_client/client.py rename dsst/{dsst_sql => dsst_client/dsst_gtk3}/__init__.py (100%) rename dsst/{ => dsst_client}/dsst_gtk3/dialogs.py (99%) rename dsst/{ => dsst_client}/dsst_gtk3/gtk_ui.py (98%) create mode 100644 dsst/dsst_client/dsst_gtk3/handlers/__init__.py rename dsst/{ => dsst_client}/dsst_gtk3/handlers/base_data_handlers.py (96%) rename dsst/{ => dsst_client}/dsst_gtk3/handlers/death_handlers.py (93%) rename dsst/{ => dsst_client}/dsst_gtk3/handlers/dialog_handlers.py (94%) rename dsst/{ => dsst_client}/dsst_gtk3/handlers/handlers.py (97%) rename dsst/{ => dsst_client}/dsst_gtk3/handlers/season_handlers.py (93%) rename dsst/{ => dsst_client}/dsst_gtk3/handlers/victory_handlers.py (92%) rename dsst/{ => dsst_client}/dsst_gtk3/reload.py (96%) rename dsst/{ => dsst_client}/dsst_gtk3/resources/glade/dialogs.glade (100%) rename dsst/{ => dsst_client}/dsst_gtk3/resources/glade/window.glade (100%) rename dsst/{ => dsst_client}/dsst_gtk3/util.py (100%) create mode 100644 dsst/dsst_server/__init__.py create mode 100644 dsst/dsst_server/data_access/__init__.py rename dsst/{dsst_sql => dsst_server/data_access}/sql.py (100%) rename dsst/{dsst_sql => dsst_server/data_access}/sql_func.py (98%) create mode 100644 dsst/dsst_server/server.py diff --git a/dsst/__main__.py b/dsst/__main__.py index 4475530..7c28945 100644 --- a/dsst/__main__.py +++ b/dsst/__main__.py @@ -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() \ No newline at end of file diff --git a/dsst/dsst_gtk3/__init__.py b/dsst/common/__init__.py similarity index 100% rename from dsst/dsst_gtk3/__init__.py rename to dsst/common/__init__.py diff --git a/dsst/common/models.py b/dsst/common/models.py new file mode 100644 index 0000000..96d2493 --- /dev/null +++ b/dsst/common/models.py @@ -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') \ No newline at end of file diff --git a/dsst/common/util.py b/dsst/common/util.py new file mode 100644 index 0000000..903be04 --- /dev/null +++ b/dsst/common/util.py @@ -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 \ No newline at end of file diff --git a/dsst/dsst_gtk3/handlers/__init__.py b/dsst/dsst_client/__init__.py similarity index 100% rename from dsst/dsst_gtk3/handlers/__init__.py rename to dsst/dsst_client/__init__.py diff --git a/dsst/dsst_client/client.py b/dsst/dsst_client/client.py new file mode 100644 index 0000000..45db76c --- /dev/null +++ b/dsst/dsst_client/client.py @@ -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() + diff --git a/dsst/dsst_sql/__init__.py b/dsst/dsst_client/dsst_gtk3/__init__.py similarity index 100% rename from dsst/dsst_sql/__init__.py rename to dsst/dsst_client/dsst_gtk3/__init__.py diff --git a/dsst/dsst_gtk3/dialogs.py b/dsst/dsst_client/dsst_gtk3/dialogs.py similarity index 99% rename from dsst/dsst_gtk3/dialogs.py rename to dsst/dsst_client/dsst_gtk3/dialogs.py index 10a517a..614bb7c 100644 --- a/dsst/dsst_gtk3/dialogs.py +++ b/dsst/dsst_client/dsst_gtk3/dialogs.py @@ -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 diff --git a/dsst/dsst_gtk3/gtk_ui.py b/dsst/dsst_client/dsst_gtk3/gtk_ui.py similarity index 98% rename from dsst/dsst_gtk3/gtk_ui.py rename to dsst/dsst_client/dsst_gtk3/gtk_ui.py index e987820..330a325 100644 --- a/dsst/dsst_gtk3/gtk_ui.py +++ b/dsst/dsst_client/dsst_gtk3/gtk_ui.py @@ -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: diff --git a/dsst/dsst_client/dsst_gtk3/handlers/__init__.py b/dsst/dsst_client/dsst_gtk3/handlers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dsst/dsst_gtk3/handlers/base_data_handlers.py b/dsst/dsst_client/dsst_gtk3/handlers/base_data_handlers.py similarity index 96% rename from dsst/dsst_gtk3/handlers/base_data_handlers.py rename to dsst/dsst_client/dsst_gtk3/handlers/base_data_handlers.py index b2c4d61..36c2d51 100644 --- a/dsst/dsst_gtk3/handlers/base_data_handlers.py +++ b/dsst/dsst_client/dsst_gtk3/handlers/base_data_handlers.py @@ -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: diff --git a/dsst/dsst_gtk3/handlers/death_handlers.py b/dsst/dsst_client/dsst_gtk3/handlers/death_handlers.py similarity index 93% rename from dsst/dsst_gtk3/handlers/death_handlers.py rename to dsst/dsst_client/dsst_gtk3/handlers/death_handlers.py index aa45acd..fa4cbff 100644 --- a/dsst/dsst_gtk3/handlers/death_handlers.py +++ b/dsst/dsst_client/dsst_gtk3/handlers/death_handlers.py @@ -1,5 +1,6 @@ from gi.repository import Gtk -from dsst_gtk3 import dialogs, gtk_ui + +from dsst_gtk3 import dialogs class DeathHandlers: diff --git a/dsst/dsst_gtk3/handlers/dialog_handlers.py b/dsst/dsst_client/dsst_gtk3/handlers/dialog_handlers.py similarity index 94% rename from dsst/dsst_gtk3/handlers/dialog_handlers.py rename to dsst/dsst_client/dsst_gtk3/handlers/dialog_handlers.py index 5204828..1f34514 100644 --- a/dsst/dsst_gtk3/handlers/dialog_handlers.py +++ b/dsst/dsst_client/dsst_gtk3/handlers/dialog_handlers.py @@ -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: diff --git a/dsst/dsst_gtk3/handlers/handlers.py b/dsst/dsst_client/dsst_gtk3/handlers/handlers.py similarity index 97% rename from dsst/dsst_gtk3/handlers/handlers.py rename to dsst/dsst_client/dsst_gtk3/handlers/handlers.py index 8856cce..182e1c2 100644 --- a/dsst/dsst_gtk3/handlers/handlers.py +++ b/dsst/dsst_client/dsst_gtk3/handlers/handlers.py @@ -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): diff --git a/dsst/dsst_gtk3/handlers/season_handlers.py b/dsst/dsst_client/dsst_gtk3/handlers/season_handlers.py similarity index 93% rename from dsst/dsst_gtk3/handlers/season_handlers.py rename to dsst/dsst_client/dsst_gtk3/handlers/season_handlers.py index 1d667f7..2d5bc6a 100644 --- a/dsst/dsst_gtk3/handlers/season_handlers.py +++ b/dsst/dsst_client/dsst_gtk3/handlers/season_handlers.py @@ -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: diff --git a/dsst/dsst_gtk3/handlers/victory_handlers.py b/dsst/dsst_client/dsst_gtk3/handlers/victory_handlers.py similarity index 92% rename from dsst/dsst_gtk3/handlers/victory_handlers.py rename to dsst/dsst_client/dsst_gtk3/handlers/victory_handlers.py index d130a34..a9a8001 100644 --- a/dsst/dsst_gtk3/handlers/victory_handlers.py +++ b/dsst/dsst_client/dsst_gtk3/handlers/victory_handlers.py @@ -1,5 +1,6 @@ from gi.repository import Gtk -from dsst_gtk3 import dialogs, gtk_ui + +from dsst_gtk3 import dialogs class VictoryHandlers: diff --git a/dsst/dsst_gtk3/reload.py b/dsst/dsst_client/dsst_gtk3/reload.py similarity index 96% rename from dsst/dsst_gtk3/reload.py rename to dsst/dsst_client/dsst_gtk3/reload.py index 6d1bca8..adff4ee 100644 --- a/dsst/dsst_gtk3/reload.py +++ b/dsst/dsst_client/dsst_gtk3/reload.py @@ -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)') \ No newline at end of file + 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 \ No newline at end of file diff --git a/dsst/dsst_gtk3/resources/glade/dialogs.glade b/dsst/dsst_client/dsst_gtk3/resources/glade/dialogs.glade similarity index 100% rename from dsst/dsst_gtk3/resources/glade/dialogs.glade rename to dsst/dsst_client/dsst_gtk3/resources/glade/dialogs.glade diff --git a/dsst/dsst_gtk3/resources/glade/window.glade b/dsst/dsst_client/dsst_gtk3/resources/glade/window.glade similarity index 100% rename from dsst/dsst_gtk3/resources/glade/window.glade rename to dsst/dsst_client/dsst_gtk3/resources/glade/window.glade diff --git a/dsst/dsst_gtk3/util.py b/dsst/dsst_client/dsst_gtk3/util.py similarity index 100% rename from dsst/dsst_gtk3/util.py rename to dsst/dsst_client/dsst_gtk3/util.py diff --git a/dsst/dsst_server/__init__.py b/dsst/dsst_server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dsst/dsst_server/data_access/__init__.py b/dsst/dsst_server/data_access/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dsst/dsst_sql/sql.py b/dsst/dsst_server/data_access/sql.py similarity index 100% rename from dsst/dsst_sql/sql.py rename to dsst/dsst_server/data_access/sql.py diff --git a/dsst/dsst_sql/sql_func.py b/dsst/dsst_server/data_access/sql_func.py similarity index 98% rename from dsst/dsst_sql/sql_func.py rename to dsst/dsst_server/data_access/sql_func.py index 11139ee..dd12793 100644 --- a/dsst/dsst_sql/sql_func.py +++ b/dsst/dsst_server/data_access/sql_func.py @@ -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: diff --git a/dsst/dsst_server/server.py b/dsst/dsst_server/server.py new file mode 100644 index 0000000..1802df1 --- /dev/null +++ b/dsst/dsst_server/server.py @@ -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()