加上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))

<<:  day 8 - 程序码也要断舍离

>>:  Day 8 - 资料储存

JavaScript型别、物件与纯值

JavaScript型别 前面有说过JavaScript是动态型别,也就是说在执行时,变数会依照赋予...

Day 20 - Self-defined Data types(in C) 自订资料型态

Intro 自订资料型态可以是 把不同 data type 合成成一个 复合的型态 或是重新定义一个...

#18 No-code 之旅 — 读取资料库来实作部落格 ft. Notion SDK

嗨大家~ 像昨天文章里提的,这专案会采用 Notion 来当 CMS (包含资料库),意思是部落格文...

Unity自主学习(二十):物件脚本(2)

今天既昨天之後,接着继续摸索脚本的编写吧! 打开脚本之後,如果觉得字太小可以按住"Ctrl...

Day 17 - 取得帐务相关资讯 (下)

官方说明文件:https://sinotrade.github.io/tutor/accountin...