How to use commands only when a current command is triggered?

Multi tool use
Multi tool use


How to use commands only when a current command is triggered?



This question might be complicated and my brain can't really explain it well so please bare with this crappy explanation, My question, When you trigger a command for example .start it will start let's say a text based game, of course you would have the commands to be able to actually play the game however my concern is people can still trigger the ingame commands without needing to start the game for example .


if message.content.startswith("/play"): #Here is the play command where you execute the game to start
await client.send_message(message.channel, "Welcome to the game!")
if message.content.startswith("/examine):
await client.send_message(message.channel, "You examined the rock and well, got a rock!") #In-Game commands/movements



What i'm saying is, is there a way of only being able to use the in-game commands only when the game itself is activated?
Additional Question: How would you store a user's information like basically saving the game (You don't really need to answer this as i would like to learn this myself but any tips would be great!)





Is the game played on a per-player or per channel level? You can see one example of how to persist data in a file in this question
– Patrick Haugh
Jun 30 at 10:56






Its per-player. My concern as said in the question is just you can still trigger the commands outside of the game.
– Cupcake
2 days ago




1 Answer
1



First, we want some object that stores the state of a particular session. We can just call this object Game. We'll maintain a mapping of discord.Users to Games. A User existing in this mapping means that they are playing the game. Some basics would look something like:


Game


discord.User


Game


User


from discord.ext import commands

class Game:
def __init__(self):
self.points = 0
self.inventory =

bot = commands.Bot('/')

sessions = {}

@bot.command(pass_context=True)
async def play(ctx):
if ctx.message.author.id in sessions:
await bot.say("You're already playing")
return
sessions[ctx.message.author.id] = Game()
await bot.say("Welcome to the game!")

@bot.command(pass_context=True)
async def quit(ctx):
if ctx.message.author.id not in sessions:
await bot.say("You're not playing the game")
return
del sessions[ctx.message.author.id]
await bot.say("Game Over")

@bot.command(pass_context=True)
async def examine(ctx):
session = sessions.get(ctx.message.author.id, None)
if session is None:
await bot.say("You're not playing the game")
return
session.inventory.append("A rock")
await bot.say("You examined the rock and well, got a rock!")

bot.run("TOKEN")



Some things you could do to extend this: make use of checks and CommandErrors to avoid having to repeat the code for checking sessions; make sure that Games are pickleable, and write code for saving games using pickle; write a game that's more fun than collecting rocks.


check


CommandError


Game





Hi! Thanks for the answer however i tried your code and my bot doesn't reply to me and also doesn't display any type of error, i've tried customizing just a bit by a bit just the text (lol) i can't seem to find the problem either that or i'm just dumb. class Game: def __init__(self): self.points = 0 self.inventory = sessions = {} @bot.command(pass_context=True) async def test(ctx): if ctx.message.author.id in sessions: await bot.say("oof") return sessions[ctx.message.author.id] = Game() await bot.say("oof 2")
– Cupcake
2 days ago



class Game: def __init__(self): self.points = 0 self.inventory = sessions = {} @bot.command(pass_context=True) async def test(ctx): if ctx.message.author.id in sessions: await bot.say("oof") return sessions[ctx.message.author.id] = Game() await bot.say("oof 2")





@Cupcake Do you have an on_message event? See: stackoverflow.com/questions/49331096/…
– Patrick Haugh
2 days ago


on_message






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

zW,8fGA,Eu9A9MhbTmsnwhXu UnDEh mHSJNPvhgXyKWMcNi9jz f7qP
SwPcOa1NxTA,s vlkRZk nziCLYZkLgNN,Mv9,LZIpm fHCkt4S2px2Tjm j6IDRk88u0OeRbf7as89AUG9kh 09,7b9 oDs6 Y3le

Popular posts from this blog

Delphi Android file open failure with API 26

.

Amasya