using System;
//using System.Collections; // ArrayList
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccelIRC;
using AccelIRC.EventArgs;
using System.Threading;
using System.IO;
namespace SuitBot
{
class Program
{
/*
static int port = 6667;
static string nick = "SuitNot";
static string host = "random.ircd.de";
static string channel = "#ping.de";
*/
static int port = 6667;
static string clientNick = "SuitNot";
static string nick = clientNick; // wg. Reconnects clientNick zwischenspeichern
static string nickReconSuffix = "_Reconnected";
static string host = "irc.euirc.net";
static string channel = "#channel";
static string prefix = "!";
static IRCClient _irc;
//Logging
static string logBegin;
static bool logging = true;
static bool logTimestampFilename = true;
static string logPrefix = "log_";
static string logSuffix = ".log";
static string logFileName = initLog();
static Textfile logFile = new Textfile();
//Main-Handling
//static ArrayList argsL = new ArrayList();
static List<string> argsL = new List<string>();
static void Main(string[] args)
{
//List<string> argsL = args.ToList();
argsL.AddRange(args);
argsL.LastIndexOf("!recon!");
bool recon = false;
if (argsL.Remove("!recon!"))
{
recon = true;
}
if (recon)
{
if (nick.Length > 30 - nickReconSuffix.Length)
{
nick = clientNick;
}
else
{
nick += nickReconSuffix;
}
}
Log(string.Format("Nick:\t{0}", nick));
Log(string.Format("Server:\t{0}", host));
//#init Event-Handler & client
_irc = new IRCClient(nick, nick, nick);
_irc.EngineReconnected += new IRCClient.EngineReconnectionHandler(_irc_EngineReconnected);
//_irc.UserNickChanged += new IRCClient.UserNickChangedHandler(_irc_UserNickChanged);
_irc.EndOfMOTD += new IRCClient.EndOfMotdHandler(_irc_EndOfMOTD);
_irc.ServerMessageReceived += new IRCClient.ServerMessageReceivedHandler(_irc_ServerMessageReceived);
_irc.UserJoined += new IRCClient.UserJoinHandler(_irc_UserJoined);
_irc.UserParted += new IRCClient.UserPartHandler(_irc_UserParted);
_irc.ChannelMessage += new IRCClient.ChannelMessageHandler(_irc_ChannelMessage);
_irc.Connect(host, port);
// Log(logFileName); // DEBUG
Log(string.Format("Port:\t{0} <- verbunden.", port));
while (_irc.Connected)
{
Thread.Sleep(1000);
// Log(".", false);
}
//#uninit Event-Handler & client
_irc.EngineReconnected -= new IRCClient.EngineReconnectionHandler(_irc_EngineReconnected);
//_irc.UserNickChanged -= new IRCClient.UserNickChangedHandler(_irc_UserNickChanged);
_irc.EndOfMOTD -= new IRCClient.EndOfMotdHandler(_irc_EndOfMOTD);
_irc.ServerMessageReceived -= new IRCClient.ServerMessageReceivedHandler(_irc_ServerMessageReceived);
_irc.UserJoined -= new IRCClient.UserJoinHandler(_irc_UserJoined);
_irc.UserParted -= new IRCClient.UserPartHandler(_irc_UserParted);
_irc.ChannelMessage -= new IRCClient.ChannelMessageHandler(_irc_ChannelMessage);
_irc.Dispose();
// SHOOP-DA-LOOP!
argsL.Add("!recon!");
Main(argsL.ToArray());
}
/* static void _irc_UserNickChanged(object sender, UserNickChangedEventArgs e)
{
if (nick.Length > 30 - nickReconSuffix.Length)
{
nick = clientNick;
}
else
{
nick += nickReconSuffix;
}
Send(sender.ToString(), "nick " + nick);
Log("horst");
}*/
static void _irc_EngineReconnected()
{
}
static void _irc_EndOfMOTD()
{
_irc.JoinChannel(channel);
Log(string.Format("Joine Channel: {0}", channel));
}
static void _irc_ServerMessageReceived(string msg)
{
// HACK:nospoof Problem mit euIRC-Timeouts lösen
string pingnotice = string.Format("NOTICE {0} :*** If you are having problems connecting due to ping timeouts, please type /notice ", nick);
string nospoofid;
if (msg.StartsWith(pingnotice))
{
nospoofid = msg.Substring(pingnotice.Length, 8);
LogMsg(nospoofid, nick, "nospoof");
_irc.SendNotice(nospoofid, "nospoof");
}
//HACKEND
/* TODO
if (msg.EndsWith(":irc.jen.de.euirc.net 433 * SuitNot :Nickname is already in use."))
{
string server = msg
}
*/
}
static void _irc_UserJoined(object sender, UserJoinEventArgs e)
{
Log(string.Format("[{0}] JOIN: {1}!{2}@{3}", e.Channel, e.Nick, e.User, e.Host));
}
static void _irc_UserParted(object sender, UserPartEventArgs e)
{
Log(string.Format("[{0}] PART: {1}!{2}@{3}", e.Channel, e.Nick, e.User, e.Host));
Log(string.Format("QUIT-Message:\t{0}", e.PartMessage));
}
static void _irc_ChannelMessage(object sender, ChannelMessageEventArgs e)
{
LogMsg(channel, e.Nick, e.Message, false);
if (e.Message.StartsWith(prefix) && e.Nick != nick)
{
string msg = e.Message.Substring(1); //prefix entfernen
string[] args = msg.Split(' ');
string func = args[0].ToLower(); //simples case-versimpeln
args = args.Skip(1).ToArray(); //Funktionsnamen aus args entfernen
//foreach (var item in args) Log(item);
Send(e.Channel, Bot(func, args)); //Botgedöns
}
}
static string Bot(string func, string[] args)
{
string text = "";
int count = args.Count();
switch (func)
{
case "decide":
if (count > 0)
{
Random randomNumber = new Random();
int rnd = randomNumber.Next(0, count);
text = string.Format("Ich bin der Meinung, \"{0}\" wäre angemessen.", args[rnd]);
}
else
text = "Entscheide dich, was ich für dich entscheiden soll!";
break;
case "say":
// text = string.Format("Ich soll euch sagen: \"{0}\"", string.Join(" ", args));
text = string.Join(" ", args);
break;
case "wetter":
if (count > 0)
{
Conditions conditions = new Conditions();
conditions = Gwetter.GetCurrentConditions(string.Join(" ", args));
if (conditions != null)
{
text = "Das Wetter in " + conditions.City;
text += " >>> Verhältnisse: " + conditions.Condition;
text += " | Temperatur: " + conditions.TempC + "°C";
text += " | Luft-" + conditions.Humidity;
text += " | " + conditions.Wind;
}
else
{
text = "Hmpf. Fehler. kA, was geht. Entweder du bist zu blöd um zu tippen, oder versuch's später nochmal.";
}
}
else
text = "Allgemeines Wetter ist immer gut.";
break;
case "thema":
break;
case "wiki":
if (count > 0)
{
// WikiPage wiki = new WikiPage();
// wiki = WikiApi.getPage(string.Join("_", args));
}
break;
default:
text = "Hmpf. Ich bin zu dumm, um diese Funktion zu kennen. Tut mich Sorry!";
break;
}
return text;
}
//IRC-Message/Notice versenden
static void Send(string to, string text, bool msg = true)
{
if (msg)
_irc.SendMessage(to, text);
else
_irc.SendNotice(to, text);
LogMsg(to, nick, text);
}
//Loggen vorbereiten
static string initLog()
{
string logFileName = logPrefix;
logBegin = Stamp_Now("date");
if (logTimestampFilename)
logFileName += logBegin;
logFileName += logSuffix;
return logFileName;
}
static void Log(string str, bool nl = true)
{
str = string.Format("|{0}| {1}", Stamp_Now("date+longtime"), str);
if (logging)
{
string now = Stamp_Now("date");
// Falls sich während der Laufzeit das Datum ändert:
if (now != logBegin)
{
logFileName = initLog();
}
// Logfile vorhanden?
if(File.Exists(logFileName))
{
logFile.Append(logFileName, str);
}
else
{
logFile.WriteFile(logFileName, str);
}
}
if (nl)
{
Console.WriteLine(str);
}
else
{
Console.Write(str);
}
}
static void LogMsg(string to, string from, string str, bool self=true)
{
if(self)
Log(string.Format("!{0}! >{1}< {2}", to, from, str));
else
Log(string.Format("[{0}] <{1}> {2}", to, from, str));
}
static string Stamp_Now(string format = "date", string seperator = "|")
{
string now = "";
if (format == "date")
{
now += string.Format("{0:yyyy-MM-dd}", DateTime.Now);
}
else if (format == "date+longtime")
{
now += string.Format("{0:yyyy-MM-dd}{1}{2:HH:mm:ss}", DateTime.Now, seperator, DateTime.Now);
}
else if (format == "longtime")
{
now += string.Format("{0:HH:MM:SS}", DateTime.Now);
}
return now;
}
}
}