KHD

channels.js

KHD
Jan 10th, 2015
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var util = require('util');
  2.  
  3. var Channels = {};
  4. var Users = {};
  5.  
  6. var AUTH = {
  7.     "+": "v",
  8.     "%": "h",
  9.     "@": "o",
  10.     "&": "a",
  11.     "~": "q"
  12. }
  13. // Object types
  14. var Channel = function Channel(name) {
  15.     var channel = Object.create(Channel.prototype);
  16.     channel.name = name.toLowerCase() || "#";
  17.     channel.users = {};
  18.     channel.topic = "";
  19.     channel.topicHistory = []; // [Current, Previous, ... , First Known Topic]
  20.     channel.mode = "";
  21.     channel.modes = {};
  22.  
  23.     return channel;
  24. }
  25.  
  26. Channel.prototype = {
  27.     addUser: function (nick) {
  28.         var auth = nick.charAt(0) in AUTH ? nick.charAt(0) : "";
  29.         nick = auth ? nick.substr(1) : nick;
  30.         this.users[nick] = nick;
  31.         if (auth) {
  32.             this.updateModes({mode: AUTH[auth], parameter: nick});
  33.         }
  34.         // if (!Users[nick]) Users[nick] = new User(nick);
  35.     },
  36.  
  37.     removeUser: function (nick) {
  38.         delete this.users[nick];
  39.         for (var symbol in AUTH) {
  40.             if (this.modes[AUTH[symbol]][nick]) this.updateModes({mode: AUTH[auth], parameter: nick, remove: true});
  41.         }
  42.     },
  43.    
  44.     renameUser: function (nick, newNick) {
  45.         this.users[newNick] = this.users[nick];
  46.         for (var symbol in AUTH) {
  47.             if (this.modes[AUTH[symbol]][nick]) this.updateModes({mode: AUTH[auth], parameter: newNick}, this.modes[AUTH[symbol]][nick]);
  48.         }
  49.         this.removeUser(nick);
  50.     },
  51.    
  52.     updateTopic: function (topic) {
  53.         this.topic = topic;
  54.         this.topicHistory.unshift({topic:topic});
  55.     },
  56.     updateTopicInfo: function (editedBy, lastEdited) {
  57.         this.topicHistory[0].editedBy = editedBy;
  58.         this.topicHistory[0].lastEdited = lastEdited;
  59.     },
  60.     updateModes: function (modeObj, sender) {
  61.         var mode = modeObj.mode, remove = !!modeObj.remove, parameter = modeObj.parameter || false;
  62.         var listModes = {"v":"+","h":"%","o":"@","a":"&","q":"~","b":"bans","e":"excepts","I":"invited"};
  63.         if (mode in listModes) {
  64.             if (!this.modes[mode]) this.modes[mode] = {};
  65.             if (remove) delete this.modes[mode][parameter]
  66.             else this.modes[mode][parameter] = sender || "Not Specified";
  67.         } else {
  68.             if (remove) delete this.modes[mode];
  69.             else this.modes[mode] = parameter || true;
  70.         }
  71.     },
  72.     getAuth: function (nick, auth) { // Returns the auth level (v,h,o,a,q) or if auth is specified a boolean if they are at or above that auth level.
  73.         nick = nick || "";
  74.         if (!this.users[nick]) return null;
  75.         var authModes = {"v":"+","h":"%","o":"@","a":"&","q":"~"}
  76.         auth = auth in authModes ? auth : false;
  77.         var authLevels = ['q', 'a', 'o', 'h', 'v'];
  78.         var nickAuth = "";
  79.         for (var i = 0; i < authLevels.length; i++) {
  80.             var mode = authLevels[i];
  81.             if (this.modes[mode][nick]) {
  82.                 if (auth && authLevels.indexOf(auth) <= authLevels.indexOf(mode)) return true;
  83.                 nickAuth += mode;
  84.             }
  85.         }
  86.         if (auth && !nickAuth) return false;
  87.         return nickAuth;
  88.     },
  89.  
  90.     banList: {},
  91.     exceptList: {},
  92.     addExcept: {},
  93.     inviteList: {},
  94.     addInvite: {},
  95.     modes: {
  96.         "v": {},
  97.         "h": {},
  98.         "o": {},
  99.         "a": {},
  100.         "q": {}
  101.     }
  102. };
  103.  
  104. function addChannel(name) {
  105.     if (name.charAt(0) !== "#") return;
  106.     Channels[name] = Channel(name);
  107. }
  108.  
  109. function removeChannel(name) {
  110.     if (name.charAt(0) !== "#") return;
  111.     delete Channels[name];
  112. }
  113.  
  114. var channel_plugin = {
  115.     name: "channels",
  116.     init: function (client, imports) {
  117.         client.Channels = Channels;
  118.         client.Users = Users;
  119.         var handles = {
  120.             'join': function (msg) { // client.on('join') Add a user or channel
  121.                 // if (true) return console.log('my name: ' + client.receiver.nickname() + ' nickname: ' + msg.nickname);
  122.                 var isSelf = client.nickname() === msg.nickname;
  123.                 if (isSelf) Channels[msg.channel] = Channel(msg.channel);
  124.                 else {
  125.                     Channels[msg.channel].addUser(msg.nickname);
  126.                 }
  127.             },
  128.             'quit': function (msg) { // client.on('quit') Remove user from all channels and from user list
  129.                 var nick = msg.nickname;
  130.                 var reason = msg.reason;
  131.                 for (var channel in Channels) {
  132.                     var chan = Channels[channel];
  133.                     if (nick in chan.users) chan.removeUser(nick);
  134.                 }
  135.             },
  136.             'part': function (msg) { // client.on('part') Remove user from parted channel
  137.                 Channels[msg.channel].removeUser(msg.nickname);
  138.             },
  139.             'nick': function (msg) { // client.on('nick') Update nick across channels
  140.                 var nick = msg.old;
  141.                 var newNick = msg.new;
  142.                 for (var channel in Channels) {
  143.                     var chan = Channels[channel];
  144.                     if (nick in chan.users) chan.renameUser(nick, newNick);
  145.                 }
  146.             },
  147.             '332' : function (msg) { // client.on('332') Update Topic
  148.                 var channel = msg.channel || msg.chanenl;
  149.                 Channels[channel].updateTopic(msg.topic);
  150.             },
  151.             '333': function (msg) { // client.on('333') Update Topic Info
  152.                 Channels[msg.channel].updateTopicInfo(msg.who, msg.timestamp);
  153.             },
  154.             '353' : function (msg) { // client.on('353') Update channel with users
  155.                 var channel = Channels[msg.channel];
  156.                 msg.nicknames.forEach(channel.addUser.bind(channel));
  157.             },
  158.             'mode': function (msg) {
  159.                 // console.log('mode event');
  160.                 // console.log(util.inspect(msg));
  161.                 client.ModeMsg = msg;
  162.                 if (msg.channel.charAt(0) !== '#') return;
  163.                 var handleMode = (function (modeObj) {
  164.                     Channels[msg.channel].updateModes(modeObj, msg.nickname);
  165.                 }).bind(msg.channel);
  166.                 msg.modes.forEach(handleMode);
  167.             }
  168.         };
  169.         return {
  170.             handlers: handles
  171.         };
  172.     }
  173. }
  174.  
  175. module.exports = channel_plugin;
Advertisement
Add Comment
Please, Sign In to add comment