Move to basic client/server structure.

This commit is contained in:
luxick
2018-03-03 14:36:41 +01:00
parent cb129eddd1
commit 8516650af4
25 changed files with 207 additions and 18 deletions

View File

@@ -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
View 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
View 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

View 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()

View File

@@ -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

View File

@@ -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:

View 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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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):

View File

@@ -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:

View File

@@ -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:

View File

@@ -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
@@ -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) sorted_list = Counter(enemy_list).most_common(1)
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

View File

View File

View 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:

View 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()