def questControlMenu(): player = db.getPlayer(session.get("discordId")) quests = [ quest for quest in db.getAllQuests() if quest.dm and (quest.commander == player.discordId or player.discordId in quest.players.keys()) ] # Sort by date (no date after everything else) quests = sorted(quests, key=lambda x: x.date if x.date else float('inf')) currentQuestId = request.args.get("questId") currentQuest = None if currentQuestId == None: if len( quests ) > 0: # If the quest id wasn't specified, default the first on the list currentQuest = quests[0] else: for quest in quests: # Find the quest with the right id if quest.questId == currentQuestId: currentQuest = quest playerDict = {player.discordId: player for player in db.getAllPlayers()} return render_template("controlcenter.html", player=player, quests=quests, currentQuest=currentQuest, roles=Roles, playerDict=playerDict)
def controlCenterAction(action): logAction() questId = request.args['questId'] discordId = session.get("discordId") quest = db.getQuest(questId) player = db.getPlayer(discordId) if action == "claimRole": roleId = request.args['roleId'] result, message = quest.setRole(player, roleId) if result: role = Roles[roleId] player.leadership -= role['cost'] elif action == "releaveRole": roleId = quest.getPlayerRole(player) result, message = quest.setRole(player, None) if result: role = Roles[roleId] player.leadership += role['cost'] elif action == "useActive": activeId = request.args['activeId'] result, message = quest.activateRolePower(player, activeId) if result: active = Roles[quest.getPlayerRole(player)]['actives'][activeId] player.leadership -= active['cost'] # if activeId == "striketrue" and player.discordId == 153199290641022977: # db.pushTask("WHISPER") else: return "Unknown action", 400 if result: db.setQuest(quest) db.setPlayer(player) return message, 200 else: return message, 400
def questPlayerAction(action): logAction() questId = request.args['questId'] discordId = session.get("discordId") quest = db.getQuest(questId) player = db.getPlayer(discordId) if action == "claimCommander": result, message = quest.setCommander(player) if result: player.leadership -= quest.leadershipReq elif action == "releaveCommander": result, message = quest.setCommander(None) if result: player.leadership += quest.leadershipReq elif action == "joinQuest": # Recredit the leadership if they are currently a commander if player.discordId == quest.commander: player.leadership += quest.leadershipReq result, message = quest.addPlayer(player) elif action == "leaveQuest": result, message = quest.removePlayer(player) else: return "Unknown action", 400 if result: db.setQuest(quest) db.setPlayer(player) return message, 200 else: return message, 400
def dmCorner(): player = db.getPlayer(session.get("discordId")) quests = db.getAllQuests() playerDict = {player.discordId: player for player in db.getAllPlayers()} return render_template("dmcorner.html", player=player, quests=quests, playerDict=playerDict)
def wrapper(*args, **kwargs): discordId = session.get("discordId") if discordId == None: return redirect(config.ApiKeys['discord']['OAuthUrl'], code=302) player = db.getPlayer(session.get("discordId")) if player == None: session.clear() return redirect(config.ApiKeys['discord']['OAuthUrl'], code=302) return func(*args, **kwargs)
def chronicle(): player = db.getPlayer(session.get("discordId")) playerDict = {player.discordId: player for player in db.getAllPlayers()} pastQuests = db.getPastQuests() return render_template("thechronicle.html", player=player, playerDict=playerDict, pastQuests=pastQuests, roles=Roles)
def stampReference(): player = db.getPlayer(session.get("discordId")) stampData = [] currentTotal = 0 for level, stampsToNext in config.StampLevelToNext.items(): stampData.append((level, currentTotal)) currentTotal += stampsToNext return render_template("stampReference.html", player=player, stampData=stampData)
def updatePlayerStats(): logAction() formData = request.form.to_dict() discordId = formData.pop("discordId") player = db.getPlayer(discordId) if player == None: return "Player not found", 404 player.deserialise(formData) db.setPlayer(player) return redirect("/playeradmin", code=302)
def index(): player = db.getPlayer(session.get("discordId")) playerDict = {player.discordId: player for player in db.getAllPlayers()} quests = db.getAllQuests() quests = sorted(quests, key=lambda x: x.date if x.date else float('inf')) return render_template("questboard.html", player=player, quests=quests, playerDict=playerDict, roles=Roles)
def spendCompanyPoints(): logAction() influence = int(request.form['influence']) leadership = int(request.form['leadership']) discordId = session.get("discordId") player = db.getPlayer(discordId) result, message = player.spendPoints(influence, leadership) db.setPlayer(player) if result: return redirect(request.referrer or "/") else: return message, 400
def wrapper(*args, **kwargs): player = db.getPlayer(session.get("discordId")) questId = request.args.get("questId") or request.form.to_dict().get( "questId") if questId == None: return func(*args, ) quest = db.getQuest(questId) if quest == None: return func(*args, **kwargs) if player.admin or quest.commander == player.discordId or quest.dm == player.discordId: return func(*args, **kwargs) return "You do not have write access to this quest", 403
def questadmin(): playerDict = { int(player.discordId): player for player in db.getAllPlayers() } quests = db.getAllQuests() player = db.getPlayer(session.get("discordId")) return render_template("questadmin.html", player=player, quests=quests, playerDict=playerDict, roles=Roles)
def dmClaimQuest(): logAction() questId = request.args['questId'] discordId = session.get("discordId") quest = db.getQuest(questId) player = db.getPlayer(discordId) if quest.dm != None: return "This quest already has a DM", 403 quest.setDm(player) db.setQuest(quest) if quest.dm != None: db.pushTask("NEWQUEST " + quest.questId) return redirect("/dmcorner", code=302)
def updateSelfStats(): logAction() formData = request.form.to_dict() discordId = session.get("discordId") player = db.getPlayer(discordId) if "influence" in formData: assert int(formData['influence']) >= 0 player.influence = formData['influence'] if "leadership" in formData: assert int(formData['leadership']) >= 0 player.leadership = formData['leadership'] db.setPlayer(player) return redirect(request.referrer or "/")
def addQuestPageDM(): player = db.getPlayer(session.get("discordId")) playerDict = {player.discordId: player for player in db.getAllPlayers()} if request.args.get("questId"): questId = request.args.get('questId') quest = db.getQuest(questId) if quest == None: return (f"Quest id {questId} not found", 404) else: quest = Quest() return render_template("addquest.html", player=player, prefill=quest, DM=True, playerDict=playerDict)
def actionLogs(): logs = subprocess.check_output( ['/usr/bin/tail', '-20', './logs/questactions.log']) logs = logs.decode("utf-8").splitlines()[::-1] players = db.getAllPlayers() quests = db.getAllQuests() for i, log in enumerate(logs): for player in players: logs[i] = logs[i].replace( str(player.discordId), f""" <div class="inlinediv discord-{player.discordId}"> <div class="innerdiv nick">{player.nick}</div> <div class="innerdiv discordId">{player.discordId}</div> </div> """) player = db.getPlayer(session.get("discordId")) return render_template("serverlogs.html", player=player, players=players, quests=quests, logs=logs)
def dmCornerAction(action): logAction() questId = request.args['questId'] discordId = request.args.get('discordId') quest = db.getQuest(questId) if discordId == None: player = None else: player = db.getPlayer(discordId) result, message = None, None # if action == "setDate": # result, message = quest.setDate(request.args.get("date")) if action == "kickPlayer": result, message = quest.removePlayer(player) elif action == "releaveDM": result, message = quest.setDm(None) else: return "Unknown action", 400 if result: db.setQuest(quest) return message, 200 else: return message, 400
def questAdminAction(action): logAction() questId = request.args['questId'] discordId = request.args.get("discordId") quest = db.getQuest(questId) if discordId == None: player = None else: player = db.getPlayer(discordId) if action == "changeCommander": result, message = quest.setCommander(player, forceAdd=True) elif action == "changeDM": result, message = quest.setDm(player, forceAdd=True) elif action == "addPlayer": result, message = quest.addPlayer(player, removeCommander=False, forceAdd=True) elif action == "removePlayer": result, message = quest.removePlayer(player) elif action == "changeRole": roleId = request.args['roleId'] if roleId == "unselected": roleId = None result, message = quest.setRole(player, roleId, forceAdd=True) elif action == "refreshPlayerRole": result, message = quest.refreshPlayerRole(player) elif action == "setVoidRewards": boolparam = request.args["boolparam"] if boolparam == "false": boolparam = False elif boolparam == "true": boolparam = True else: return "Missing boolparam", 400 result, message = quest.setVoidRewards(player, boolparam) else: return "Unknown action", 400 if result: db.setQuest(quest) return message, 200 else: return message, 400
def setDatePage(): player = db.getPlayer(session.get("discordId")) questId = request.args['questId'] quest = db.getQuest(questId) if quest == None: return (f"Quest id {questId} not found", 404) return render_template("setDate.html", player=player, quest=quest)
def makeICS(): player = db.getPlayer(request.args["discordId"]) cal = db.makeICS(player) return Response(str(cal), mimetype="text/calendar", headers={"Content-disposition": "attachment; filename=chainmarches.ics"})
def playeradmin(): player = db.getPlayer(session.get("discordId")) return render_template("playeradmin.html", player=player, players=db.getAllPlayers(), quests=db.getAllQuests())
def wrapper(*args, **kwargs): player = db.getPlayer(session.get("discordId")) if player == None or not player.admin: return "You require admin permission to access this resource", 403 return func(*args, **kwargs)
def wrapper(*args, **kwargs): player = db.getPlayer(session.get("discordId")) if player == None or not (player.canDM or player.admin): return "You are not able to DM a quest", 403 return func(*args, **kwargs)