Don't like ads? PRO users don't see any ads ;-)
Guest

Program.cs [SuitBot_2012-05-08]

By: SuitableOrNot on May 8th, 2012  |  syntax: C#  |  size: 11.28 KB  |  hits: 34  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. using System;
  2. //using System.Collections; // ArrayList
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using AccelIRC;
  7. using AccelIRC.EventArgs;
  8. using System.Threading;
  9. using System.IO;
  10.  
  11. namespace SuitBot
  12. {
  13.     class Program
  14.     {
  15. /*
  16.         static int port = 6667;
  17.         static string nick = "SuitNot";
  18.         static string host = "random.ircd.de";
  19.         static string channel = "#ping.de";
  20. */
  21.      
  22.         static int port = 6667;
  23.         static string clientNick = "SuitNot";
  24.         static string nick = clientNick;            // wg. Reconnects clientNick zwischenspeichern
  25.         static string nickReconSuffix = "_Reconnected";
  26.         static string host = "irc.euirc.net";
  27.         static string channel = "#channel";
  28.  
  29.         static string prefix = "!";
  30.         static IRCClient _irc;
  31.         //Logging
  32.         static string   logBegin;
  33.         static bool     logging = true;
  34.         static bool     logTimestampFilename = true;
  35.         static string   logPrefix = "log_";
  36.         static string   logSuffix = ".log";
  37.         static string   logFileName = initLog();
  38.         static Textfile logFile = new Textfile();
  39.         //Main-Handling
  40.         //static ArrayList argsL = new ArrayList();
  41.         static List<string> argsL = new List<string>();
  42.                
  43.  
  44.         static void Main(string[] args)
  45.         {
  46.             //List<string> argsL = args.ToList();
  47.             argsL.AddRange(args);
  48.             argsL.LastIndexOf("!recon!");
  49.  
  50.             bool recon = false;
  51.             if (argsL.Remove("!recon!"))
  52.             {
  53.                 recon = true;
  54.             }
  55.             if (recon)
  56.             {
  57.                 if (nick.Length > 30 - nickReconSuffix.Length)
  58.                 {
  59.                     nick = clientNick;
  60.                 }
  61.                 else
  62.                 {
  63.                     nick += nickReconSuffix;
  64.                 }
  65.             }
  66.             Log(string.Format("Nick:\t{0}", nick));
  67.             Log(string.Format("Server:\t{0}", host));
  68.             //#init Event-Handler & client
  69.             _irc = new IRCClient(nick, nick, nick);
  70.             _irc.EngineReconnected += new IRCClient.EngineReconnectionHandler(_irc_EngineReconnected);
  71.             //_irc.UserNickChanged += new IRCClient.UserNickChangedHandler(_irc_UserNickChanged);
  72.             _irc.EndOfMOTD += new IRCClient.EndOfMotdHandler(_irc_EndOfMOTD);
  73.             _irc.ServerMessageReceived += new IRCClient.ServerMessageReceivedHandler(_irc_ServerMessageReceived);
  74.             _irc.UserJoined += new IRCClient.UserJoinHandler(_irc_UserJoined);
  75.             _irc.UserParted += new IRCClient.UserPartHandler(_irc_UserParted);
  76.             _irc.ChannelMessage += new IRCClient.ChannelMessageHandler(_irc_ChannelMessage);
  77.  
  78.  
  79.             _irc.Connect(host, port);
  80. //            Log(logFileName); // DEBUG
  81.             Log(string.Format("Port:\t{0} <- verbunden.", port));
  82.  
  83.             while (_irc.Connected)
  84.             {
  85.                 Thread.Sleep(1000);
  86. //                Log(".", false);
  87.             }
  88.            
  89.             //#uninit Event-Handler & client
  90.             _irc.EngineReconnected -= new IRCClient.EngineReconnectionHandler(_irc_EngineReconnected);
  91.             //_irc.UserNickChanged -= new IRCClient.UserNickChangedHandler(_irc_UserNickChanged);
  92.             _irc.EndOfMOTD -= new IRCClient.EndOfMotdHandler(_irc_EndOfMOTD);
  93.             _irc.ServerMessageReceived -= new IRCClient.ServerMessageReceivedHandler(_irc_ServerMessageReceived);
  94.             _irc.UserJoined -= new IRCClient.UserJoinHandler(_irc_UserJoined);
  95.             _irc.UserParted -= new IRCClient.UserPartHandler(_irc_UserParted);
  96.             _irc.ChannelMessage -= new IRCClient.ChannelMessageHandler(_irc_ChannelMessage);
  97.             _irc.Dispose();
  98.  
  99.             // SHOOP-DA-LOOP!
  100.             argsL.Add("!recon!");
  101.             Main(argsL.ToArray());
  102.         }
  103.  
  104. /*        static void _irc_UserNickChanged(object sender, UserNickChangedEventArgs e)
  105.         {
  106.             if (nick.Length > 30 - nickReconSuffix.Length)
  107.             {
  108.                 nick = clientNick;
  109.             }
  110.             else
  111.             {
  112.                 nick += nickReconSuffix;
  113.             }
  114.             Send(sender.ToString(), "nick " + nick);
  115.             Log("horst");
  116.         }*/
  117.  
  118.         static void _irc_EngineReconnected()
  119.         {
  120.  
  121.         }
  122.  
  123.         static void _irc_EndOfMOTD()
  124.         {
  125.             _irc.JoinChannel(channel);
  126.             Log(string.Format("Joine Channel: {0}", channel));
  127.         }
  128.  
  129.         static void _irc_ServerMessageReceived(string msg)
  130.         {
  131.            // HACK:nospoof Problem mit euIRC-Timeouts lösen
  132.             string pingnotice = string.Format("NOTICE {0} :*** If you are having problems connecting due to ping timeouts, please type /notice ", nick);
  133.             string nospoofid;
  134.             if (msg.StartsWith(pingnotice))
  135.             {
  136.                 nospoofid = msg.Substring(pingnotice.Length, 8);
  137.                 LogMsg(nospoofid, nick, "nospoof");
  138.                 _irc.SendNotice(nospoofid, "nospoof");
  139.             }
  140.             //HACKEND
  141. /* TODO
  142.             if (msg.EndsWith(":irc.jen.de.euirc.net 433 * SuitNot :Nickname is already in use."))
  143.             {
  144.                 string server = msg
  145.             }
  146.  */
  147.         }
  148.  
  149.         static void _irc_UserJoined(object sender, UserJoinEventArgs e)
  150.         {
  151.             Log(string.Format("[{0}] JOIN: {1}!{2}@{3}", e.Channel, e.Nick, e.User, e.Host));
  152.         }
  153.  
  154.         static void _irc_UserParted(object sender, UserPartEventArgs e)
  155.         {
  156.             Log(string.Format("[{0}] PART: {1}!{2}@{3}", e.Channel, e.Nick, e.User, e.Host));
  157.             Log(string.Format("QUIT-Message:\t{0}", e.PartMessage));
  158.         }
  159.  
  160.         static void _irc_ChannelMessage(object sender, ChannelMessageEventArgs e)
  161.         {
  162.             LogMsg(channel, e.Nick, e.Message, false);
  163.             if (e.Message.StartsWith(prefix) && e.Nick != nick)
  164.             {
  165.                 string msg = e.Message.Substring(1);    //prefix entfernen
  166.                 string[] args = msg.Split(' ');
  167.                 string func = args[0].ToLower();    //simples case-versimpeln
  168.                 args = args.Skip(1).ToArray();      //Funktionsnamen aus args entfernen
  169.                 //foreach (var item in args) Log(item);
  170.                                
  171.                                 Send(e.Channel, Bot(func, args)); //Botgedöns
  172.                                
  173.             }
  174.                
  175.         }
  176.  
  177.         static string Bot(string func, string[] args)
  178.         {
  179.             string text = "";
  180.             int count = args.Count();
  181.  
  182.             switch (func)
  183.             {
  184.                 case "decide":
  185.                     if (count > 0)
  186.                     {
  187.                         Random randomNumber = new Random();
  188.                         int rnd = randomNumber.Next(0, count);
  189.                            
  190.                         text = string.Format("Ich bin der Meinung, \"{0}\" wäre angemessen.", args[rnd]);
  191.                     }
  192.                     else
  193.                         text = "Entscheide dich, was ich für dich entscheiden soll!";
  194.                     break;
  195.  
  196.                 case "say":
  197. //                    text = string.Format("Ich soll euch sagen: \"{0}\"", string.Join(" ", args));
  198.                     text = string.Join(" ", args);
  199.                     break;
  200.  
  201.                 case "wetter":
  202.                     if (count > 0)
  203.                     {
  204.                         Conditions conditions = new Conditions();
  205.                         conditions = Gwetter.GetCurrentConditions(string.Join(" ", args));
  206.  
  207.                         if (conditions != null)
  208.                         {
  209.                                                         text = "Das Wetter in " + conditions.City;
  210.                             text += " >>> Verhältnisse: " + conditions.Condition;
  211.                             text += " | Temperatur: " + conditions.TempC + "°C";
  212.                             text += " | Luft-" + conditions.Humidity;
  213.                             text += " | " + conditions.Wind;
  214.                         }
  215.                         else
  216.                         {
  217.                             text = "Hmpf. Fehler. kA, was geht. Entweder du bist zu blöd um zu tippen, oder versuch's später nochmal.";
  218.                         }
  219.                     }
  220.                     else
  221.                         text = "Allgemeines Wetter ist immer gut.";
  222.                     break;
  223.                                
  224.                                 case "thema":
  225.                                        
  226.                                         break;
  227.  
  228.                 case "wiki":
  229.                     if (count > 0)
  230.                     {
  231. //                        WikiPage wiki = new WikiPage();
  232. //                        wiki = WikiApi.getPage(string.Join("_", args));
  233.                     }
  234.                     break;
  235.  
  236.                 default:
  237.                     text = "Hmpf. Ich bin zu dumm, um diese Funktion zu kennen. Tut mich Sorry!";
  238.                     break;
  239.             }
  240.             return text;
  241.         }
  242.  
  243.         //IRC-Message/Notice versenden
  244.         static void Send(string to, string text, bool msg = true)
  245.         {
  246.             if (msg)
  247.                 _irc.SendMessage(to, text);
  248.             else
  249.                 _irc.SendNotice(to, text);
  250.             LogMsg(to, nick, text);
  251.         }
  252.  
  253.         //Loggen vorbereiten
  254.         static string initLog()
  255.         {
  256.             string logFileName = logPrefix;
  257.             logBegin = Stamp_Now("date");
  258.  
  259.             if (logTimestampFilename)
  260.                 logFileName += logBegin;
  261.             logFileName += logSuffix;
  262.  
  263.            
  264.             return logFileName;
  265.         }
  266.  
  267.         static void Log(string str, bool nl = true)
  268.         {
  269.             str = string.Format("|{0}| {1}", Stamp_Now("date+longtime"), str);
  270.  
  271.             if (logging)
  272.             {
  273.                 string now = Stamp_Now("date");
  274.                 // Falls sich während der Laufzeit das Datum ändert:
  275.                 if (now != logBegin)
  276.                 {
  277.                     logFileName = initLog();
  278.                 }
  279.                 // Logfile vorhanden?
  280.                 if(File.Exists(logFileName))
  281.                 {
  282.                     logFile.Append(logFileName, str);
  283.                 }
  284.                 else
  285.                 {
  286.                     logFile.WriteFile(logFileName, str);
  287.                 }
  288.             }
  289.  
  290.             if (nl)
  291.             {
  292.                 Console.WriteLine(str);
  293.             }
  294.             else
  295.             {
  296.                 Console.Write(str);
  297.             }
  298.         }
  299.  
  300.         static void LogMsg(string to, string from, string str, bool self=true)
  301.         {
  302.             if(self)
  303.                 Log(string.Format("!{0}! >{1}< {2}", to, from, str));
  304.             else
  305.                 Log(string.Format("[{0}] <{1}> {2}", to, from, str));
  306.         }
  307.  
  308.         static string Stamp_Now(string format = "date", string seperator = "|")
  309.         {
  310.             string now = "";
  311.             if (format == "date")
  312.             {
  313.                 now += string.Format("{0:yyyy-MM-dd}", DateTime.Now);
  314.             }
  315.             else if (format == "date+longtime")
  316.             {
  317.                 now += string.Format("{0:yyyy-MM-dd}{1}{2:HH:mm:ss}", DateTime.Now, seperator, DateTime.Now);
  318.             }
  319.             else if (format == "longtime")
  320.             {
  321.                 now += string.Format("{0:HH:MM:SS}", DateTime.Now);
  322.             }
  323.  
  324.             return now;
  325.         }
  326.     }
  327. }