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

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!)
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.User
s to Game
s. 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 check
s and CommandError
s to avoid having to repeat the code for checking sessions; make sure that Game
s 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.
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