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 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
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')
from gi.repository import Gtk
from datetime import datetime
from dsst_sql import sql
import sql
from dsst_gtk3 import util

View File

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

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

View File

@@ -1,5 +1,6 @@
from gi.repository import Gtk
from dsst_gtk3 import dialogs, gtk_ui
from dsst_gtk3 import dialogs
class DeathHandlers:

View File

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

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

View File

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

View File

@@ -1,5 +1,6 @@
from gi.repository import Gtk
from dsst_gtk3 import dialogs, gtk_ui
from dsst_gtk3 import dialogs
class VictoryHandlers:

View File

@@ -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
@@ -114,3 +115,9 @@ def reload_episode_stats(builder: Gtk.Builder, app: 'gtk_ui.GtkUi', episode_id:
if sorted_list:
enemy_name, deaths = sorted_list[0]
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
"""
from dsst_sql.sql import *
from data_access.sql import *
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()