Advertisement
Guest User

Untitled

a guest
Oct 6th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 8.01 KB | None | 0 0
  1. void run()
  2. {
  3.     /* notify the user about starting the bot */
  4.     writefln("Starting mainloop.");
  5.  
  6.     /* this will prevent from joining multiple times */
  7.     bool joined = false;
  8.  
  9.     /* loop it baby! */
  10.     for (;;)
  11.     {
  12.         /* try receiving */
  13.         try
  14.         {
  15.             buf = irc.recv();
  16.         }
  17.         catch (Exception e)
  18.         {
  19.             /*
  20.              * on fail, return from the
  21.              * function and stop the loop
  22.              */
  23.             writeln("ERROR: ", e.msg);
  24.             return;
  25.         }
  26.  
  27.         /* let's ping in and if we're not yet joined, join. */
  28.         if (std.string.indexOf(buf, "PING") > -1)
  29.         {
  30.             /* parse the buffer */
  31.             string[] ping = buf.stripRight().split();
  32.             irc.send("PONG " ~ ping[1]);
  33.  
  34.             /* join if not joined */
  35.             if (!joined)
  36.             {
  37.                 /* loop all channels to join */
  38.                 for (size_t i = 0; i < channels.length; i++)
  39.                 {
  40.                     if (logging)
  41.                     {
  42.                         logfiles[channels[i]] = new File(
  43.                             std.path.join(
  44.                                 "logs", addExt(channels[i], "txt")
  45.                             ),
  46.                             "a"
  47.                         );
  48.                         logfiles[channels[i]].writefln(
  49.                             "*** BEGIN LOG - %s ***",
  50.                             Clock.currTime().toSimpleString()
  51.                         );
  52.                     }
  53.  
  54.                     irc.join(channels[i]);
  55.  
  56.                     /* fill up the list */
  57.                     irc.send("NAMES " ~ channels[i]);
  58.  
  59.                     string nbuf = "";
  60.                     while (std.string.indexOf(
  61.                         nbuf, "End of /NAMES list"
  62.                     ) == -1)
  63.                     {
  64.                         nbuf ~= irc.recv();
  65.                     }
  66.                     nbuf = nbuf.split(":")[2];
  67.                     users[channels[i]] = nbuf.split(" ");
  68.                 }
  69.  
  70.                 /* lock it! */
  71.                 joined = true;
  72.             }
  73.         }
  74.  
  75.         /* rejoin if kicked. */
  76.         if (std.string.indexOf(buf, "KICK") > -1
  77.          && std.string.indexOf(buf, nick ~ " :" ~ nick) > -1)
  78.         {
  79.             writefln("KICKED: REJOINING.");
  80.             irc.join(buf.split("KICK ")[1].split()[0]);
  81.         }
  82.  
  83.         /* finally, parse the message we got. */
  84.         string[] recvd = buf.split();
  85.  
  86.         /*
  87.          * MODES:
  88.          * :USER JOIN :#channel
  89.          * :USER QUIT :msg
  90.          * :USER PART #channel :msg
  91.          * :USER PRIVMSG #channel :msg
  92.          * :USER KICK #channel TARGET :msg
  93.          * :USER MODE #channel MODES MASK
  94.          * :USER NICK :NEWNICK
  95.         */
  96.  
  97.         switch(recvd[1])
  98.         {
  99.             case "PRIVMSG":
  100.             {
  101.                 writeln("INFO: Calling message handler ..");
  102.  
  103.                 string channel = recvd[2];
  104.                 string user    = recvd[0].split("!")[0][1 .. $];
  105.                 string message = buf.split(recvd[2] ~ " :")[1];
  106.  
  107.                 if (logging)
  108.                 {
  109.                     logfiles[channel].writefln(
  110.                         "%s <%s> %s",
  111.                         Clock.currTime().toSimpleString(),
  112.                         user,
  113.                         message
  114.                     );
  115.                 }
  116.  
  117.                 bool r = lua.call_message_handler(channel, user, message);
  118.  
  119.                 /* check for retval - quit if handler returns false */
  120.                 if (r) irc.quit();
  121.  
  122.                 break;
  123.             }
  124.             case "JOIN":
  125.             {
  126.                 if (!logging) break;
  127.  
  128.                 string channel = recvd[2][1..$];
  129.                 string user    = recvd[0].split("!")[0][1 .. $];
  130.  
  131.                 logfiles[channel].writefln(
  132.                     "%s * %s joined %s",
  133.                     Clock.currTime().toSimpleString(),
  134.                     user,
  135.                     channel
  136.                 );
  137.  
  138.                 size_t len = users[channel].length;
  139.                 users[channel].length = len + 1;
  140.                 users[channel][len]   = user;
  141.  
  142.                 break;
  143.             }
  144.             case "PART":
  145.             {
  146.                 if (!logging) break;
  147.  
  148.                 string channel = recvd[2];
  149.                 string user    = recvd[0].split("!")[0][1 .. $];
  150.                 string message = (recvd.length >= 4)
  151.                     ? buf.split(recvd[2] ~ " :")[1]
  152.                     : "";
  153.  
  154.                 logfiles[channel].writefln(
  155.                     "%s * %s left %s (%s)",
  156.                     Clock.currTime().toSimpleString(),
  157.                     user,
  158.                     channel,
  159.                     message
  160.                 );
  161.  
  162.                 for (int i = 0; i < users[channel].length; i++)
  163.                 {
  164.                     string nick = users[channel][i];
  165.                     if (nick == user)
  166.                     {
  167.                         users[channel] = remove(users[channel], i);
  168.                         break;
  169.                     }
  170.                 }
  171.  
  172.                 break;
  173.             }
  174.             case "QUIT":
  175.             {
  176.                 if (!logging) break;
  177.  
  178.                 string user    = recvd[0].split("!")[0][1 .. $];
  179.                 string message = buf.split(recvd[1] ~ " :")[1];
  180.  
  181.                 foreach (string channel, string[] list; users)
  182.                 {
  183.                     for (int i = 0; i < list.length; i++)
  184.                     {
  185.                         string nick = list[i];
  186.                         if (nick == user)
  187.                         {
  188.                             users[channel] = remove(list, i);
  189.                             logfiles[channel].writefln(
  190.                                 "%s * %s quit (%s)",
  191.                                 Clock.currTime().toSimpleString(),
  192.                                 nick,
  193.                                 message
  194.                             );
  195.                             break;
  196.                         }
  197.                     }
  198.                 }
  199.  
  200.                 break;
  201.             }
  202.             case "KICK":
  203.             {
  204.                 if (!logging) break;
  205.  
  206.                 string channel = recvd[2];
  207.                 string op      = recvd[0].split("!")[0][1 .. $];
  208.                 string target  = recvd[3];
  209.                 string message = buf.split(recvd[3] ~ " :")[1];
  210.  
  211.                 logfiles[channel].writefln(
  212.                     "%s * %s kicked %s from %s (%s)",
  213.                     Clock.currTime().toSimpleString(),
  214.                     op,
  215.                     target,
  216.                     channel,
  217.                     message
  218.                 );
  219.  
  220.                 break;
  221.             }
  222.             case "MODE":
  223.             {
  224.                 if (!logging || recvd.length <= 4) break;
  225.  
  226.                 string channel = recvd[2];
  227.                 string op      = recvd[0].split("!")[0][1 .. $];
  228.                 string modes   = recvd[3];
  229.                 string mask    = buf.split(recvd[3] ~ " ")[1];
  230.  
  231.                 logfiles[channel].writefln(
  232.                     "%s * %s set mode %s to %s",
  233.                     Clock.currTime().toSimpleString(),
  234.                     op,
  235.                     modes,
  236.                     mask
  237.                 );
  238.  
  239.                 break;
  240.             }
  241.             case "NICK":
  242.             {
  243.                 string new_nick = recvd[2][1..$];
  244.                 string old_nick = recvd[0].split("!")[0][1 .. $];
  245.  
  246.                 foreach (string channel, string[] list; users)
  247.                 {
  248.                     for (int i = 0; i < list.length; i++)
  249.                     {
  250.                         if (list[i] == old_nick)
  251.                         {
  252.                             users[channel][i] = new_nick;
  253.                             break;
  254.                         }
  255.                     }
  256.                 }
  257.  
  258.                 break;
  259.             }
  260.             default: break;
  261.         }
  262.     }
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement