diff --git a/model.py b/model.py
index 66e1f5c..7f01364 100644
--- a/model.py
+++ b/model.py
@@ -27,15 +27,19 @@ class Model(object):
model["sessions"] = []
if "clients" not in model:
model["clients"] = []
+ if "items" not in model:
+ model["items"] = []
self.sockets = {} # mapping: clientid -> sockets
self.sessions = { session: Session(model = model["sessions"][session]) for session in model["sessions"] }
self.clients = { client: Client(model = model["clients"][client]) for client in model["clients"] }
+ self.items = { item: Item(model = model["items"][item]) for item in model["items"] }
self.filename = "tehsession.json"
def to_json(self):
model = {
"sessions": {session: self.sessions[session].to_json() for session in self.sessions },
"clients": {client: self.clients[client].to_json() for client in self.clients },
+ "items": {item: self.items[item].to_json() for item in self.items },
}
return model
@@ -68,6 +72,20 @@ class Model(object):
raise Exception("Ownly owner can change sessionname")
session.name = sessionname
+ @ApiMethod
+ async def create_item(self, clientid, name, description, image):
+ client = self.clients[clientid]
+ if not client.session:
+ raise Exception("create_item requires the client to be host. But client is in no session")
+ session = self.sessions[client.session]
+ if (session.owner != client.id):
+ raise Exception("create_item requires the client to be host. But client is not the owner")
+ if not name:
+ raise Exception("create_item requires an item name")
+ item = Item(name = name, description = description, image = image)
+ self.items[item.id] = item
+
+
@ApiMethod
async def leave_session(self, clientid):
client = self.clients[clientid]
@@ -109,6 +127,20 @@ class Model(object):
for socket in self.sockets[clientid]:
await socket.send_json(data)
+ async def send_master_view(self, clientid):
+ data = {}
+ client = self.clients[clientid]
+ session = self.sessions[client.session]
+
+ data["view"] = "master"
+ data["username"] = client.name
+ data["session"] = session.to_json()
+ data["items"] = self.to_json()["items"]
+
+ for socket in self.sockets[clientid]:
+ await socket.send_json(data)
+
+
async def send_session_view(self, clientid):
data = {}
client = self.clients[clientid]
@@ -127,7 +159,10 @@ class Model(object):
client = self.clients[clientid]
session = self.sessions[client.session] if client.session else None
if session:
- await self.send_session_view(clientid)
+ if session.owner == client.id:
+ await self.send_master_view(clientid)
+ else:
+ await self.send_session_view(clientid)
else:
await self.send_lobby_view(clientid)
@@ -203,3 +238,28 @@ class Client:
"session": self.session,
}
return model
+
+class Item:
+
+ def __init__(self, model = None, name = None, description = "", image = ""):
+ if model:
+ self.id = model["id"]
+ self.name = model["name"]
+ self.description = model["description"]
+ self.image = model["image"]
+ elif name:
+ self.id = generate_random_id()
+ self.name = name
+ self.description = description
+ self.image = image
+ else:
+ raise Exception("Illegal Item Constructor")
+
+ def to_json(self):
+ model = {
+ "id": self.id,
+ "name": self.name,
+ "description": self.description,
+ "image": self.image,
+ }
+ return model
diff --git a/static/views/lobby/script.js b/static/views/lobby/script.js
index 6474a9b..b647bc5 100644
--- a/static/views/lobby/script.js
+++ b/static/views/lobby/script.js
@@ -1,4 +1,4 @@
- var text = document.getElementById("msg").innerText
+var text = document.getElementById("msg").innerText
msg = JSON.parse(text)
if (msg.hasOwnProperty('username')) {
diff --git a/static/views/master/script.js b/static/views/master/script.js
new file mode 100644
index 0000000..8ab623a
--- /dev/null
+++ b/static/views/master/script.js
@@ -0,0 +1,55 @@
+var text = document.getElementById("msg").innerText
+msg = JSON.parse(text)
+
+document.getElementById("btn-leave-session").onclick = async (e) => await fetch('api/leave_session', {
+ method: 'POST', body: JSON.stringify({})
+ });
+var session = msg.session;
+document.getElementById("session").innerText = session["name"];
+document.getElementById('label-username').innerText = msg.username;
+
+document.getElementById("btn-gen-item").onclick = async (e) => {
+ name = document.getElementById("input-gen-item-name").value;
+ description = document.getElementById("input-gen-item-description").value;
+ image = document.getElementById("input-gen-item-image").value;
+ if (Boolean(name)) {
+ await fetch('api/create_item', { method: 'POST', body: JSON.stringify(
+ {'name': name, 'description': description, 'image': image}
+ )});
+ }
+};
+var itemsdiv = document.getElementById("items");
+var items = msg.items;
+
+while (itemsdiv.children.length) itemsdiv.lastChild.remove();
+
+Object.keys(items).forEach( item => {
+ var item = items[item];
+ const itemdiv = document.createElement('div');
+ var name = item["name"]
+ var description = item["description"]
+ var image = item["image"] || "../static/empty.jpg"
+
+ namespan = document.createElement('b');
+ namespan.innerText = name;
+ namespan.style.display = "block"
+ namespan.style.textAlign = "center"
+
+ descriptionspan = document.createElement('span');
+ descriptionspan.innerText = description;
+ descriptionspan.style.display = "block"
+ descriptionspan.style.width = "8rem";
+
+ imageimg = document.createElement('img');
+ imageimg.src = image;
+ imageimg.style.width = "8rem";
+ imageimg.style.display = "block"
+
+ itemdiv.appendChild(namespan);
+ itemdiv.appendChild(imageimg);
+ itemdiv.appendChild(descriptionspan);
+ itemdiv.style.display = "inline-block"
+
+ itemsdiv.appendChild(itemdiv);
+
+});
diff --git a/static/views/master/template.html b/static/views/master/template.html
new file mode 100644
index 0000000..d49f6df
--- /dev/null
+++ b/static/views/master/template.html
@@ -0,0 +1,12 @@
+Welcome to , lobbymaster
+
+
+
+