Browse Source

Create birthday.js

subDesTagesMitExtraKaese 4 năm trước cách đây
mục cha
commit
926c9b0c2d
1 tập tin đã thay đổi với 156 bổ sung0 xóa
  1. 156 0
      birthday.js

+ 156 - 0
birthday.js

@@ -0,0 +1,156 @@
+registerPlugin({
+  name: 'Birthday Script',
+  version: '1.0',
+  description: 'create birthday notifications',
+  author: 'mcj201',
+  vars: [
+    {
+      name: 'message',
+      title: 'The message that should be displayed. (%n = nickname, %b = list of birthdays)',
+      type: 'multiline'
+    },
+    {
+      name: 'type',
+      title: 'Message-Type',
+      type: 'select',
+      options: [
+        'Private chat',
+        'Poke'
+      ]
+    },
+    {
+      name: 'nDays',
+      title: 'send the notification upto this amount of days after birthday',
+      type: 'number'
+    }
+  ],
+  autorun: true
+}, function(sinusbot, config, meta) {
+  const event = require('event')
+  const engine = require('engine')
+  const backend = require('backend')
+  const format = require('format')
+  var store = require('store');
+
+  engine.log(`Loaded ${meta.name} v${meta.version} by ${meta.author}.`)
+
+  event.on('load', () => {
+    const command = require('command');
+    if (!command) {
+        engine.log('command.js library not found! Please download command.js and enable it to be able use this script!');
+        return;
+    }
+    let bDays = store.get('birthdays') || {};
+    let notifs = store.get('birthday_notifications') || {};
+
+    event.on('clientMove', ({ client, fromChannel }) => {
+      const avail = getNotifications(client, 30);
+      if (avail.length < 1)
+        return;
+
+      let msgs = []
+      for(const uid of avail) {
+        msgs.push(`${getName(uid)}: ${formatDate(getBday(uid))}`);
+      }
+      const msg = config.message.replace('%n', client.name()).replace('%b', msgs.join('\r\n'))
+      if (!fromChannel) {
+        if (config.type == '0') {
+          client.chat(msg)
+        } else {
+          client.poke(msg)
+        }
+      }
+    })
+
+    command.createCommand('birthdays')
+    .help('Show user birthdays')
+    .manual('Show user birthdays from DB.')
+    .exec((client, args, reply, ev) => {
+      let msgs = ["List of saved birthdays:"];
+      for(const uid in bDays) {
+        msgs.push(`${getName(uid)}: ${formatDate(getBday(uid))}`);
+      }
+      reply(msgs.join('\r\n'));
+      
+    });
+
+    command.createCommand('birthday')
+    .addArgument(command.createArgument('string').setName('date'))
+    .help('Set user birthdays')
+    .manual('Save user birthdays to DB.')
+    .exec((client, args, reply, ev) => {
+      var date = args.date.split('.');
+      if(date.length >= 2) {
+        let m = date[0];
+        date[0] = date[1];
+        date[1] = m;
+      }
+
+      date = new Date(date);
+      if(args.date === "") {
+        let date = getBday(ev.client.uid());
+        if(date)
+          reply(`Your birthday is ${formatDate(date)}.`);
+        else
+          reply(`Set your birthday first! e.g. !birthday 24.12.`);
+      } else if(!isNaN(date)) {
+        setBday(ev.client, date);
+        reply(`Your birthday was set to ${formatDate(date)}.`);
+      } else {
+        setBday(ev.client, date);
+        reply(`Your birthday has been cleared.`);
+      }
+      
+    });
+    
+    function setBday(client, date) {
+      if(isNaN(date) && bDays[client.uid()]) {
+        delete bDays[client.uid()];
+      } else if(!isNaN(date)) {
+        bDays[client.uid()] = [client.name(), date];
+      }
+      store.set('birthdays', bDays);
+    }
+    function getBday(uid) {
+      if(!bDays[uid])
+        return undefined;
+      let [name, date] = bDays[uid];
+      if(date)
+        return new Date(date);
+      else
+        return undefined;
+    }
+    function getName(uid) {
+      let [name, date] = bDays[uid];
+      return name;
+    }
+
+    function getNotifications(client, nDays = 30) {
+      const start = new Date();
+      start.setDate(start.getDate()-nDays);
+      const now = new Date();
+
+      let sentNotifs = notifs[client.uid()] || {};
+      let avail = [];
+      for(const uid in bDays) {
+        let bDay = new Date(bDays[uid][1]);
+        bDay.setFullYear((new Date()).getFullYear());
+        let lastNotif = new Date(sentNotifs[uid]);
+        if(bDay >= start && bDay <= now && (isNaN(lastNotif) || lastNotif < start)) {
+          avail.push(uid);
+          sentNotifs[uid] = now;
+        }
+      }
+      notifs[client.uid()] = sentNotifs;
+      store.set('birthday_notifications', notifs);
+      return avail;
+    }
+  
+    function formatDate(dt) {
+      if(dt)
+        return `${dt.getDate()}.${dt.getMonth()+1}.`;
+      else
+        return 'invalid date';
+    }
+  });
+});