From f1430cd49bdb61e25b54a87eaeddd290882cd9e0 Mon Sep 17 00:00:00 2001 From: Dominic Zimmer Date: Mon, 20 Apr 2020 23:34:54 +0200 Subject: [PATCH] Add item moving to master view --- model.py | 56 +++++++++++++++++++++++++++++++++-- static/views/master/script.js | 44 ++++++++++++++++++++++++--- tehsession.json | 2 +- 3 files changed, 95 insertions(+), 7 deletions(-) diff --git a/model.py b/model.py index 4f661df..bbf02d9 100644 --- a/model.py +++ b/model.py @@ -107,6 +107,60 @@ class Model(object): client.session = sessionid session.clients.append(client.id) + + @ApiMethod + async def move_item(self, clientid, fromplayer, toplayer, itemid, toslot, fromslot): + client = self.clients[clientid] + fromclient = next((client for client in self.clients.values() if client.name == fromplayer), None) + toclient = next((client for client in self.clients.values() if client.name == toplayer), None) + if fromplayer == "master": + # create item + if not toclient: + raise Exception("to-client is illegal") + session = self.sessions[client.session] + if not session: + raise Exception("move item must be used in session") + if client.id != session.owner: + raise Exception("Only owner can move items") + toslot -= 1 + if toslot > len(session.inventories[toclient.id]): + raise Exception("Index out of toplayers range") + session.inventories[toclient.id].insert(toslot, itemid) + elif toplayer == "master": + if not fromclient: + raise Exception("from-client is illegal") + session = self.sessions[client.session] + if not session: + raise Exception("move item must be used in session") + if client.id != session.owner: + raise Exception("Only owner can move items") + if itemid not in session.inventories[fromclient.id]: + raise Exception("he does not have that item") + fromslot -= 1 + if fromslot > len(session.inventories[fromclient.id]): + raise Exception("Index out of fromplayer range") + session.inventories[fromclient.id].pop(fromslot) + else: + if not fromclient and not toclient: + raise Exception("from- or to-client are illegal") + session = self.sessions[client.session] + if not session: + raise Exception("move item must be used in session") + if client.id != session.owner: + raise Exception("Only owner can move items") + if itemid not in session.inventories[fromclient.id]: + raise Exception("he does not have that item") + toslot -= 1 + if toslot > len(session.inventories[toclient.id]): + raise Exception("Index out of toplayers range") + fromslot -= 1 + if fromslot > len(session.inventories[fromclient.id]): + raise Exception("Index out of fromplayer range") + session.inventories[fromclient.id].pop(fromslot) + session.inventories[toclient.id].insert(toslot, itemid) + + + @ApiMethod async def draw(self, clientid): await self.send_state(clientid) @@ -220,8 +274,6 @@ class Session: raise Exception("Illegal session constructor") def get_items(self, playerid): - print(f"get_items(self, {playerid}) called") - print(f"{self.inventories=}") if playerid in self.inventories: return self.inventories[playerid] else: diff --git a/static/views/master/script.js b/static/views/master/script.js index fa2ea9f..ea06eae 100644 --- a/static/views/master/script.js +++ b/static/views/master/script.js @@ -1,8 +1,27 @@ var text = document.getElementById("msg").innerText msg = JSON.parse(text) +function onDrag (evt) { + var item = evt.item; // dragged HTMLElement + fromplayer = evt.from.getAttribute("inventory") + toplayer = evt.to.getAttribute("inventory") + itemid = item.getAttribute("itemid") + toslot = evt.newIndex + fromslot = evt.oldIndex + data = { + "fromplayer": fromplayer, + "toplayer": toplayer, + "itemid": itemid, + "fromslot": fromslot, + "toslot": toslot, + } + fetch('api/move_item', { + method: 'POST', + body: JSON.stringify(data), + }); +} function draw_item(item) { - const itemdiv = document.createElement('div'); + const itemdiv = document.createElement('itemdiv'); var name = item["name"] var description = item["description"] var image = item["image"] || "../static/empty.jpg" @@ -27,6 +46,7 @@ function draw_item(item) { itemdiv.appendChild(descriptionspan); itemdiv.style.display = "inline-block" itemdiv.style.background = "lightcoral" + itemdiv.setAttribute("itemid", item["id"]); return itemdiv } @@ -64,7 +84,15 @@ Object.keys(items).forEach( item => { itemsdiv.appendChild(itemdiv); }); -Sortable.create(itemsdiv, {"group": "items"}); +Sortable.create(itemsdiv, + { + "group": "items", + "sort": "false", + "draggable": "itemdiv", + "onEnd": onDrag, + +}); +itemsdiv.setAttribute("inventory", "master"); wrapper.appendChild(itemsheading); wrapper.appendChild(itemsdiv); @@ -84,13 +112,21 @@ Object.keys(msg.inventories).forEach( name => { Object.keys(inventory).forEach( item => { item = inventory[item]; var thediv = draw_item(item); - thediv.style.display = "block"; + //thediv.style.display = "block"; inventorydiv.appendChild(thediv); inventorydiv.style.display = "inline-block"; }); - Sortable.create(inventorydiv, {"group": "items"}); inventorydiv.style.background = "lightgreen"; + + Sortable.create(inventorydiv, + { + "group": "items", + "sort": "false", + "draggable": "itemdiv", + "onEnd": onDrag, + }); + inventorydiv.setAttribute("inventory", name); inventories.appendChild(inventorydiv); diff --git a/tehsession.json b/tehsession.json index 54c9d91..1cdbd32 100644 --- a/tehsession.json +++ b/tehsession.json @@ -1 +1 @@ -{"sessions": {"2b7jrklcn6eulwbw": {"id": "2b7jrklcn6eulwbw", "name": "Die coole session von Player 1", "clients": ["bkrqopf5j6q3tpta", "hmrcjnvo2ngs7265"], "owner": "bkrqopf5j6q3tpta", "inventories": {"cho2o2ntflm4mq3u": ["hr3gqfed4zelzdcz", "hr3gqfed4zelzdcz"], "bkrqopf5j6q3tpta": ["7htnswtslkla6rqh", "tuqjjll2cltlw6i6"]}}}, "clients": {"bkrqopf5j6q3tpta": {"id": "bkrqopf5j6q3tpta", "name": "Player 1", "session": "2b7jrklcn6eulwbw"}, "cho2o2ntflm4mq3u": {"id": "cho2o2ntflm4mq3u", "name": "uiae", "session": ""}, "hmrcjnvo2ngs7265": {"id": "hmrcjnvo2ngs7265", "name": "Joe", "session": "2b7jrklcn6eulwbw"}}, "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", "tags": {}}, "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", "tags": {}}, "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", "tags": {}}}} \ No newline at end of file +{"sessions": {"2b7jrklcn6eulwbw": {"id": "2b7jrklcn6eulwbw", "name": "Die coole session von Player 1", "clients": ["bkrqopf5j6q3tpta", "hmrcjnvo2ngs7265"], "owner": "bkrqopf5j6q3tpta", "inventories": {"cho2o2ntflm4mq3u": ["7htnswtslkla6rqh", "7htnswtslkla6rqh", "7htnswtslkla6rqh", "7htnswtslkla6rqh", "7htnswtslkla6rqh"], "bkrqopf5j6q3tpta": ["tuqjjll2cltlw6i6", "tuqjjll2cltlw6i6", "tuqjjll2cltlw6i6", "hr3gqfed4zelzdcz", "hr3gqfed4zelzdcz", "hr3gqfed4zelzdcz"]}}}, "clients": {"bkrqopf5j6q3tpta": {"id": "bkrqopf5j6q3tpta", "name": "Player 1", "session": "2b7jrklcn6eulwbw"}, "cho2o2ntflm4mq3u": {"id": "cho2o2ntflm4mq3u", "name": "uiae", "session": ""}, "hmrcjnvo2ngs7265": {"id": "hmrcjnvo2ngs7265", "name": "Joe", "session": "2b7jrklcn6eulwbw"}}, "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", "tags": {}}, "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", "tags": {}}, "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", "tags": {}}}} \ No newline at end of file