using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using Meebey.SmartIrc4net;
using System.Threading;
using System.Timers;
using System.Numerics;
using ChatterBotAPI;
namespace IrcBot
{
class BotEngine
{
#region Campi
static private int port = Configuration.Port;
static private string server = Configuration.Server;
static private string channelName = Configuration.ChannelName;
static private string nickname = Configuration.Nickname;
static private IrcClient irc
= new IrcClient
();
static List
<Command
> commandsList
= new List
<Command
>();
static Hashtable permissionTable
= new Hashtable
();
#endregion
#region Proprieta`
#endregion
#region Costruttore
public BotEngine()
{
#region Eventi
irc.
OnReadLine += new ReadLineEventHandler
(OnReadLine
);
irc.
OnConnected += new EventHandler
(OnConnected
);
irc.
OnRawMessage += new IrcEventHandler
(OnRawMessage
);
irc.
OnQueryMessage += new IrcEventHandler
(OnQueryMessage
);
irc.
OnJoin += new JoinEventHandler
(OnJoin
);
irc.
OnDisconnected += new EventHandler
(OnDisconnected
);
irc.
OnNickChange += new NickChangeEventHandler
(OnChangeNick
);
permissionTable.Add(Configuration.AdminNickmane, 10);
#endregion
#region Settaggi
irc.Encoding = System.Text.Encoding.UTF8;
irc.ActiveChannelSyncing = true;
irc.SendDelay = 0;
#endregion
}
#endregion
#region Gestione Eventi
private void OnJoin(object sender, JoinEventArgs e)
{
//SendMessage(SendType.Action, channelName, "entrato nuovo utente");
}
private void OnQueryMessage(object sender, IrcEventArgs e)
{
Console.WriteLine(e.Data.Type + ":");
Console.WriteLine("(private) <" + e.Data.Nick + "> " + e.Data.Message);
}
private void OnRawMessage(object sender, IrcEventArgs e)
{
Console.WriteLine(e.Data.Type + ":");
Console.WriteLine("(" + e.Data.Channel + ") <" + e.Data.Nick + "> " + e.Data.Message);
if (e.Data.Message == null)
return;
if (e.Data.Channel == null)
return;
if (e.Data.Nick == null)
return;
string Message = e.Data.Message;
// AGGIORNAMENTO ED ESECUZIONE DEI COMANDI
foreach (Command command in commandsList)
{
if (command.CanPerform)
command.Update(e);
if (Message.StartsWith(command.CommandText))
if ((int)permissionTable[e.Data.Nick] >= command.Permission)
command.Execute(e);
}
}
private void OnConnected(object sender, EventArgs e)
{
Console.WriteLine("Connected.");
//SendMessage(SendType.Message, channelName, "Buongiorno da StupidBot");
}
private void OnDisconnected(object sender, EventArgs e)
{
Console.WriteLine("Disconnected from server");
}
private void OnReadLine(object sender, ReadLineEventArgs e)
{
if (e.Line.StartsWith("PING"))
{
string server = e.Line.Split(' ')[1];
irc.RfcPong(server, Priority.Critical);
Console.WriteLine("Responded to ping at {0}.", DateTime.Now.ToShortTimeString());
}
}
private void OnChangeNick(object sender, NickChangeEventArgs e)
{
int permission = (int)permissionTable[e.OldNickname];
permissionTable.Remove(e.OldNickname);
permissionTable.Add(e.NewNickname, permission);
Console.WriteLine(e.OldNickname + " Changed to: " + e.NewNickname);
}
#endregion
#region Metodi
private void Listen()
{
while (true)
{
try
{
irc.ListenOnce();
}
catch
{
}
}
}
private void ReadCommands()
{
while (true)
{
irc.WriteLine(Console.ReadLine());
}
}
public void StartConnection()
{
irc.Connect(server, port);
irc.Login(nickname, nickname, 0, nickname);
irc.RfcJoin(channelName);
new Thread
(new ThreadStart
(ReadCommands
)).
Start();
Listen(); // LOOP
irc.Disconnect();
}
public void AddCommand(Command command)
{
commandsList.Add(command);
}
public static List<Command> GetCommandsList()
{
return commandsList;
}
public static Channel GetChannel(string channelName)
{
return irc.GetChannel(channelName);
}
public static bool ContainsUser(string channelName, string userNick)
{
Channel channel = GetChannel(channelName);
foreach (ChannelUser user in channel.Users.Values)
{
if (user.Nick == userNick)
return true;
}
return false;
}
public static void JoinChannel(string channelName)
{
irc.RfcJoin(channelName);
}
public static int CountUsers(string channelName)
{
return GetChannel(channelName).Users.Count;
}
public static void Disconnect()
{
irc.Disconnect();
}
public static void KickUser(string channelName, string userToKick)
{
irc.RfcKick(channelName, userToKick);
}
public static void ChangePermissionValue(string key, int value)
{
permissionTable[key] = value;
}
public static void AddPermissionPair(string key, int value)
{
permissionTable.Add(key, value);
}
public static bool ContainsPermissionKey(string key)
{
return permissionTable.ContainsKey(key);
}
public static void SendMessage(SendType sendType, string channelName, string message)
{
irc.SendMessage(sendType, channelName, message);
}
#endregion
}
}