iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
自我挑戰組

Discord-bot,從0開始到做出一個機器人系列 第 16

加上random與time模組,限制次數與時間的管理(2)

製造一個停止條件

  • 我會在這邊設置新變數
mat = 0
  • 但是我也必須要有一個可以寫入的函式
async def write_data(user, mat):
    users = await read_data()
    if str(user) in users:
        return False
    with open("match.json", "w") as f:
        json.dump(users, f)
    return Ture
  • 把剛才的變數加入rand函式裡
@bot.command(pass_context = True)
async def rand(ctx):
    users, mat = await write_data(ctx.author, mat = 0)
    get = await match_data(ctx.author, mat) 
    cat = random.randint(0, 4)
    await ctx.send(lucky[int(cat)])
    await ctx.send("本日次數已用完")
  • 關於mat,就是傳給write_data()這個函式的一個變數。
    所以我們可以利用計數的方式,去讓它做一個中止點。在上面先假設了mat = 0,之後就依照所求去做斷點。
if mat == 1:
    get = await match_data(ctx.author, mat) 
    cat = random.randint(0, 4)
    await ctx.send(lucky[int(cat)])
else:
    await ctx.send("本日次數已用完")

關於mat回傳值

  • 回到write_data()
# user = author,但為甚麼要加上ctx呢,因為姑且算是文字吧XD
async def write_data(user, mat):
    # 省略
    return Ture
  • 其實應該要回傳2個東西回去,但是這邊只有一個,所以需要更改

  • 我們需要知道在json裡面的key and value,但這邊要先設想一個情況,如果key根本沒在json裡怎麼辦

users[str(user.id)] = {}
users[str(user.id)]["count"] = 0
  • 再來,我們處理json key的部分
if str(user.id) not in users : 
    users[str(user.id)] = {}
    users[str(user.id)]["count"] = 0
    mat = 1
  • 如果key不在裡面,就創建一個附與給他,然後直接給它一個mat = 1

出現了問題

  • 第一,mat的值
  • 第二,我們忘記的match_data函式還沒下手
users[str(user.id)]["count"] = 0
mat = 1
  • 如果說,我們是用 mat 來計數的話,那我們還要處理一下這個部分
if users[str(user.id)]["count"] == 0:
    users[str(user.id)] = {}
    users[str(user.id)]["count"] = 1
    mat = 1
  • 我們把value改成了 1 ,雖然說mat值不變,但你要記得回傳給它
return True, mat
  • 然後我們處理一下 match_data()
async def match_data(user, mat):
    users = await read_data()
  • 這邊我主要是改mat的值,因為不管怎麼說,使用了!rand指令後,不管有沒有在json檔裡面,創建好{ }後,value都會直接變成1
if mat == 1:
    mat = 2
     return True, mat

這部分的程式碼

from discord.ext import commands
import discord
from discord.ext.commands import bot
from core.any import Cog_Extension
import json
import random

lucky = ["lucky~~~", "not bad", "Soso", "green hat", 
"fuck your self"]

class randomLucky(Cog_Extension):
    
    @commands.command()
    async def rand(self,ctx):
        users, mat = await write_data(ctx.author, mat = 0)
        if mat == 1:
            get = await match_data(ctx.author, mat) 
            cat = random.randint(0, 4)
            await ctx.send(lucky[int(cat)])
        else:
            await ctx.send("本日次數已用完")

async def read_data():
    with open("match.json", "r") as file:
        users = json.load(file)
    return users
    
async def write_data(user, mat):
    users = await read_data()
    if str(user) in users:
        return False
    #find json.key   
    if str(user.id) not in users : 
        users[str(user.id)] = {}
        users[str(user.id)]["count"] = 0
        mat = 1
    if users[str(user.id)]["count"] == 0:
        users[str(user.id)] = {}
        users[str(user.id)]["count"] = 1
        mat = 1
    with open("match.json", "w") as f:
        json.dump(users, f)
    return True, mat  

async def match_data(user, mat):
    users = await read_data()
    if mat == 1:
        mat = 2
        return True, mat
   

def setup(bot):
    bot.add_cog(randomLucky(bot))

上一篇
加上random與time模組,限制次數與時間的管理(1)
下一篇
加上random與time模組,限制次數與時間的管理(3)
系列文
Discord-bot,從0開始到做出一個機器人30

尚未有邦友留言

立即登入留言