• 技术交流
  • 【技术贴】手把手实现Dice!2.5.1的定时广播早安

基于Dice!2.5.1的四个新机制,我们可以实现定时任务-调用脚本-广播通知的全流程:

  1. .admin clock指令允许设置任意名称的定时任务,而不仅限于原有的on/off/clear;
  2. 通过读取plugin文件夹下lua脚本中的表task_call,将脚本函数注册到指定任务名;
  3. 通过.send notice [通知等级] [通知文本]指令,可以向所有满足通知等级的窗口广播通知;
  4. 通知等级从原有的0~5扩展为了0~9,其中6~9不会被内置机制所使用;

因此我们可以如下定义一个定时早安机制:

  1. .admin clock+good_morning=7:30注册一个在7:30执行的定时任务good_morning;

  2. 在plugin文件夹下新建一个每日问安.lua文件,在里面添加

       task_call = {
           good_morning="morning_call",
       }

    将脚本内函数morning_call注册到定时任务good_morning;

  3. 继续在lua文件内添加函数morning_call。这里我们占用通知窗口6用于早安专用窗口,请注意各个自定义功能的窗口不要起冲突。函数内使用eventMsg构造一条虚拟指令,视为自己私聊对自己发送了.send notice指令。

       notice_head = ".send notice 6 "
       function table_draw(tab)
           if(#tab==0)then return "" end
           return tab[ranint(1,#tab)]
       end
       morning_word = {
           "早安呐~",
           "早上好哟~起床了吗?",
       }
       function morning_call()
           eventMsg(notice_head..table_draw(morning_word), 0, getDiceQQ())
       end
  4. 继续在lua文件内添加两个脚本指令用于用户自由订阅及取消早安,如果希望由自己发放早安资格,可略过此步骤。

       msg_order = {}
       function book_alarm_call(msg)
           eventMsg(".admin notice "..printChat(msg).." +6", 0, getDiceQQ())
           return "已订阅{self}的定时早午晚安服务√"
       end
       function unbook_alarm_call(msg)
           eventMsg(".admin notice "..printChat(msg).." -6", 0, getDiceQQ())
           return "已退订{self}的定时早午晚安服务√"
       end
       msg_order["订阅问安"]="book_alarm_call"
       msg_order["退订问安"]="unbook_alarm_call"

    以上,一套完整的订阅问安机制就完成了。你也可以下载以下模板文件,安装到Dice存档目录下的plugin文件夹,来代替2-4步。

    daily-call.zip
    1kB
安研色Shiki 将标题更改为 「【技术贴】手把手实现Dice!2.5.1的定时广播早安」。
8 个月 后

qaqwu 如果你没有改动上面的脚本的话,订阅和退订的指令分别是订阅问安退订问安

脚本放到文件夹后,设定完定时任务,然后使用订阅指令无法订阅,是需要加载lua文件么?怎么加载?

    safeiya 我猜这可能是由于你没有重启Dice!导致的。如果你不希望重启dice!,你也可以通过使用指令让dice!重新读取目录内的文件(详情请看手册)

    1 个月 后
    7 天 后

    更新了最新版本,用帖子里的脚本没有修改过,一到设置定时任务的时候后台程序就会自己闪退这样的情况有出现过吗?

    请问admin clock功能可以实现“在某个时间段才可以触发的代码”吗?(比如只有早上七点到九点才对“吃早餐”有回应)

      Whaledoll admin clock是定点执行事件,如果想要在某个时间段内可以触发回复,可以用lua写判定,那就与本楼无关啦

      8 个月 后

      想请问一下,附件中的脚本是只能应用于群内发布定时问安么,如果想要实现小窗的定时问安功能,应该怎么改呢?

        Lily Black 糟了,我现在是群订阅正常,小窗订阅有订阅成功的回复,但到了时间没有反应,以为是脚本本身不支持。

          ray91 骰主对骰娘发送.admin notice确认一下是不是真的有小窗的通知(应当是6级)
          有的话再确认一下骰娘和用户是否为好友

            Lily Black 发现两个订阅了的小窗都不在通知等级6里,只有群在的,非常感谢!

            5 个月 后

            如果不在等级6的话要怎么样变成等级6呢

              2 年 后

              这个请问现在还能用吗,发送订阅功能是正常的,但是到时间了不会触发设定好的词,都是6级以上窗口。是不是因为设定了好几个task的原因,代码如下

              task_call = {
                  good_morning="good_morning",
                  good_afternoon="good_afternoon",
                  good_evening="good_evening",
                  good_night="good_night",
              }
              notice_head = ".send notice 6 "
              function table_draw(tab)
                  if(#tab==0)then return "" end
                  return tab[ranint(1,#tab)]
              end
              morning_word = {
                  "早上好",
              }
              afternoon_word = {
                  "三点多咯",
              }
              evening_word = {
                  "已经七点多了",
              }
              night_word = {
                  "夜深了",
              }
              
              function good_morning()
                  eventMsg(notice_head..table_draw(morning_word), 0, getDiceQQ())
              end
              function good_afternoon()
                  eventMsg(notice_head..table_draw(afternoon_word), 0, getDiceQQ())
              end
              function good_evening()
                  eventMsg(notice_head..table_draw(evening_word), 0, getDiceQQ())
              end
              function good_night()
                  eventMsg(notice_head..table_draw(night_word), 0, getDiceQQ())
              end
              
              function printChat(msg)
                  if(msg.fromGroup=="0")then
                      return "QQ "..msg.fromQQ
                  else
                      return "group "..msg.fromGroup
                  end
              end
              
              msg_order = {}
              function book_alarm_call(msg)
                  eventMsg(".admin notice "..printChat(msg).." +6", 0, getDiceQQ())
                  return "已订阅{self}的定时早午晚安服务√"
              end
              function unbook_alarm_call(msg)
                  eventMsg(".admin notice "..printChat(msg).." -6", 0, getDiceQQ())
                  return "已退订{self}的定时早午晚安服务√"
              end
              msg_order["订阅问安"]="book_alarm_call"
              msg_order["退订问安"]="unbook_alarm_call"
                11 天 后

                Wolfensniper 您可以查看一下是不是dice版本的缘故。
                之前我有一直使用这个功能且是多任务,可正常使用,对应dice版本为653。
                最近更换了dice框架以后使用了最新版(644),就出现了不能触发任务的情况。
                我手动把版本降回去以后就可以正常使用了。
                您可以在diceki文件夹中查看一下您现在dice的版本号,如果版本比较高的话,换一个低一点的版本试一下。

                说点什么吧...