[DAY 23]纠团通知功能(3/3)

纠团的功能我把它切成两个部分

  1. 使用者输入讯息
  2. 背景执行
    今天介绍背景执行的部分

背景执行

这个部分主要是让程序持续读取资料库里的任务时间与现在时间相减是否在一小时以内

要让程序持续读取资料有两个办法
一个是用While回圈另一个是用discord里的tasks.loop()这函式记得要import进去:

from discord.ext import commands,tasks

函式里面可以设定要多久时间执行一次程序码,相当方便

这边要特别注意时区转换的部分

还记得先前我们在执行GCP时我们的服务是架在美国那边,所以我们还需要把美国时区转成台湾时区

转换写法如下:

from datetime import datetime,timezone,timedelta
now_time = datetime.utcnow().replace(tzinfo=timezone.utc)
now_time = now_time.astimezone(timezone(timedelta(hours=8)))
now_time = now_time.strftime('%m/%d-%H:%M')

接着就是判断任务时间与现在时间相减是否在一小时以内

json档里会有多个任务存在所以需要用for回圈遍历每个任务时间

附上背景执行程序码

class tasktiming(Cog_Extension):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.tasktime.start()
        self.count=0
        self.id = 0

    @tasks.loop(seconds=10)
    async def tasktime(self):
        embed = discord.Embed()
        self.generalchannel = self.bot.get_channel(779782707080069193)#记得改成功会generalID
        
        self.channel = self.bot.get_channel(887264861510328340)#记得改纠团频道ID
        #由於服务器架在美国所以要转时区
        now_time = datetime.utcnow().replace(tzinfo=timezone.utc)
        now_time = now_time.astimezone(timezone(timedelta(hours=8)))
        now_time = now_time.strftime('%m/%d-%H:%M')
        # print(now_time)
        with open("setting.json",'r',encoding="utf8") as jfile:
            jdata = json.load(jfile)
        # print(len(jdata))
        if len(jdata) >0:
            #遍例每笔资料确认每笔时间
            for key in list(jdata):
                # print(key, ":", jdata[key])
                if datetime.strptime(now_time, '%m/%d-%H:%M') < datetime.strptime(jdata[key]["time"], '%m/%d-%H:%M'):
                    remain_hour = datetime.strptime(jdata[key]["time"], '%m/%d-%H:%M')-datetime.strptime(now_time, '%m/%d-%H:%M')
                    remain_hour = remain_hour.seconds/3600#转成小时
                    # print(remain_hour)
                    #剩余时间小於一小时执行下面动作
                    if remain_hour < 1 :
                        # print("complete")
                        #在general频道发通知
                        user_wordlist = ["有任务快开始罗~赶快来参加",f'任务名称 : {jdata[key]["task"]}']+[f'时间 : {jdata[key]["time"]}']+[f'备注 : {jdata[key]["condition"]}' if "condition" in jdata[key] else '备注 : 无']+[f'[传送门]( {jdata[key]["url"]})']
                        embed.description = "\n".join(user_wordlist)
                        await self.generalchannel.send(embed=embed)
                        self.count=1
                        del jdata[key]
                        with open("setting.json",'w',encoding="utf8") as jfile:
                            jdata = json.dump(jdata,jfile,indent=4)
                    else:
                        pass
                else:
                    del jdata[key]
                    with open("setting.json",'w',encoding="utf8") as jfile:
                            jdata = json.dump(jdata,jfile,indent=4)

最後呈现结果如下:


<<:  [Day23] 信箱验证API – views

>>:  Day23 - Shioaji X Backtesting - RSI低买高卖策略

Day 10 ( 中级 ) 超时空跑马灯 ( 广播 )

超时空跑马灯 ( 广播 ) 教学原文参考:超时空跑马灯 ( 广播 ) 这篇文章会介绍如何使用「发送数...

[13th][Day19] http request header(上)

golang 服务 常用於 http server/ http client 来看看一张厉害的图儿 ...

【Day 29】情境模拟:如何沟通让工程师在乎设计细节 !? 设计师需要学前端技术面吗 !?

工程师不在乎设计细节怎麽办!? 设计师需要学前端技术面吗!? 专案中如果碰到不在意间格距离、颜色色码...

Day 20:如何撰写测试

今天就书中描述与我个人的开发经验,来谈谈该如何撰写测试吧。有时候我们可能会遇到,软件在开发之初并没有...

离职倒数11天:「怎样算好PM?」

这几天到处问别人「怎样算好PM?」 我的前同事告诉我公司有标准答案: MS leadership p...