После увеличения данных сообщение Discord, отправленное пользователю, отключается на 1 - PullRequest
0 голосов
/ 08 мая 2019

Когда я увеличиваю выигрыш на 1 в БД и возвращаю количество выигрышей, которые есть у пользователя, он всегда выключается на 1.

Например, в коде ниже:

import discord
import pymongo

client = discord.Client()
mongo = MongoClient('localhost', 27017)
db = mongo.collection
profiles = db.profiles

@client.event
async def on_message(message):
    if message.author == client.user:
        return

if message.content.startswith('!iwin'):
    profile = profiles.find_one({'discordID': message.author.id})
    updatewin = profiles.find_one_and_update({'discordID': message.author.id}, {"$inc":
                                                                 {"wins": 1, "coins": 40}})
    win_msg = "Your win has been recorded. You have {} wins!".format(profile['wins'])

Если я наберу! Iwin, 1 победа будет записана в БД, однако полученное сообщение будет Your win has been recorded. You have 0 wins! И если я снова наберу! Iwin, записывается второй выигрыш, всего 2 выигрыша, но сообщение гласит Your win has been recorded. You have 1 wins! Мне кажется, что сообщение отправляется до приращения, как мне обойти это?

EDIT Это также влияет на любой тип операции, которую я пытаюсь добавить, используя поле wins. Например:

win_msg = "Your win has been recorded."
await message.channel.send(win_msg)
if profile['wins']%2==0:
    roll = random.randint(1,809)
    roll_msg = "You have won 2 games! Here is your roll: {}. Would you like to !keep or !reroll?".format(roll)
    await message.channel.send(roll_msg)

Он всегда рассчитывает это неправильно. Поэтому, если у меня есть 2 победы в БД, это не дает бросок, но если у меня есть 1 выигрыш в БД, он делает вычисление броска.

1 Ответ

1 голос
/ 08 мая 2019

Вы можете просто явно добавить 1 в форматирование строки. Это будет выглядеть так:

win_msg = "Your win has been recorded. You have {} wins!".format(int(profile['wins']) + 1)

Вам, вероятно, тоже не нужен int(), но я обычно включаю его, чтобы и компьютер, и мое будущее понимали, каковы были мои намерения.

Из вашего обновления может показаться, что ваша база данных обновляется не так, как вы ожидаете. Я не уверен, что возвращает ваш find_one() метод, но это может быть статическое значение (вероятно, было бы неплохо включить его в ваш пост). Вы пытались проверить это с помощью таких заявлений? (Кроме того, я думаю, что ваш if блок должен иметь отступ?)

if message.content.startswith('!iwin'):
    profile = profiles.find_one({'discordID': message.author.id})
    print(profile)
    updatewin = profiles.find_one_and_update({'discordID': message.author.id}, {"$inc":{"wins": 1, "coins": 40}})
    print(profile) # has this changed?
    # maybe you need to call your find_one method again? Like
    profile = profiles.find_one({'discordID': message.author.id})
    print(profile) # is it updated now??
...