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 +

+ + +
+ Name:
+ Description:
+ Image:
+ +
+
+
diff --git a/tehsession.json b/tehsession.json index 9611f49..70cf9e1 100644 --- a/tehsession.json +++ b/tehsession.json @@ -1 +1,42 @@ -{"sessions": {"2b7jrklcn6eulwbw": {"id": "2b7jrklcn6eulwbw", "name": "die neue session", "clients": ["fjvkc3whtpbi7oo2", "bkrqopf5j6q3tpta"], "owner": "bkrqopf5j6q3tpta"}, "omg2h5imnh5nk42i": {"id": "omg2h5imnh5nk42i", "name": "meine sess", "clients": [], "owner": "bkrqopf5j6q3tpta"}, "vc7bn2t76hmjexjz": {"id": "vc7bn2t76hmjexjz", "name": "meine", "clients": [], "owner": "bkrqopf5j6q3tpta"}, "csbbc4gb4lc3jxby": {"id": "csbbc4gb4lc3jxby", "name": "meine", "clients": [], "owner": "bkrqopf5j6q3tpta"}, "jjfqw3itbsh3ylna": {"id": "jjfqw3itbsh3ylna", "name": "uiae", "clients": [], "owner": "fjvkc3whtpbi7oo2"}, "bjgdd4qfpzmnhfka": {"id": "bjgdd4qfpzmnhfka", "name": "eueue", "clients": [], "owner": "bkrqopf5j6q3tpta"}}, "clients": {"bkrqopf5j6q3tpta": {"id": "bkrqopf5j6q3tpta", "name": "dominic", "session": ""}, "cho2o2ntflm4mq3u": {"id": "cho2o2ntflm4mq3u", "name": "uiae", "session": ""}, "fjvkc3whtpbi7oo2": {"id": "fjvkc3whtpbi7oo2", "name": "Me", "session": "2b7jrklcn6eulwbw"}}} \ No newline at end of file +{ + "sessions": { + "2b7jrklcn6eulwbw": { + "id": "2b7jrklcn6eulwbw", + "name": "Die coole session von Player 1", + "clients": [], + "owner": "bkrqopf5j6q3tpta" + } + }, + "clients": { + "bkrqopf5j6q3tpta": { + "id": "bkrqopf5j6q3tpta", + "name": "Player 1", + "session": "" + }, + "cho2o2ntflm4mq3u": { + "id": "cho2o2ntflm4mq3u", + "name": "uiae", + "session": "" + } + }, + "items": { + "hr3gqfed4zelzdcz": { + "id": "hr3gqfed4zelzdcz", + "name": "Revive", + "description": "Revives a KO pokemon and brings it to 50% health", + "image": "https://1.bp.blogspot.com/-Hz8sIf0g7cY/VsyVIWiLsnI/AAAAAAAAnII/DjW20xLr0R4/s1600/max_revive_by_peetzaahhh2010-d8oki1o.png" + }, + "7htnswtslkla6rqh": { + "id": "7htnswtslkla6rqh", + "name": "Potion", + "description": "Heals your Pokey-Man by 20 hp", + "image": "https://cdn.bulbagarden.net/upload/thumb/4/45/PotionBaseSet94.jpg/200px-PotionBaseSet94.jpg" + }, + "tuqjjll2cltlw6i6": { + "id": "tuqjjll2cltlw6i6", + "name": "Revive\u2122", + "description": "When mom tells you that there is Max-Revive at home", + "image": "https://www.pokewiki.de/images/5/58/Vitalkraut_Traumwelt.png" + } + } +}