PsyOps

IRCWeb

Mar 30th, 2014
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 37.09 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. // Battle Stuffs
  7. using BattleCore;
  8. using BattleCore.Events;
  9. using BattleCorePsyOps;
  10. // Sql stuffs
  11. using MySql.Data.MySqlClient;
  12. using System.Diagnostics;
  13. // Read/Write to file
  14. using System.IO;
  15. // IRC
  16. using Meebey.SmartIrc4net;
  17. // Other stuffs
  18. using System.Collections;
  19. using System.Threading;
  20. using System.Timers;
  21. using System.Text.RegularExpressions;
  22.  
  23. namespace SSZWeb
  24. {
  25.     [Behavior("IRCWeb", "true", "0.01", "PsyOps", "Updates website with arena list and connects to irc.")]
  26.     public class IRCWeb:BotEventListener
  27.     {
  28.         public IRCWeb()
  29.         {
  30.             RegisterCommand("!quit", doQuit);
  31.             RegisterCommand("!ping", doPing);
  32.  
  33.             BotPos.MapPositionX = 512 * 16;
  34.             BotPos.MapPositionY = 512 * 16;
  35.         }
  36.         public void doQuit(ChatEvent c) { DisconnectIRC(); }
  37.         public void doPing(ChatEvent c) { irc.RfcPing(MyServer); }
  38.  
  39.         // --------------------------------------------  VARIABLES AND NEEDED CLASSES   ||
  40.         // -----------------------------------------------------------------------------//
  41.         // Custom chat module - PsyOps
  42.         ShortChat msg = new ShortChat();
  43.         // Stores botname and arena
  44.         string BotName, Arena = "";
  45.         PlayerPositionEvent BotPos = new PlayerPositionEvent();
  46.         double BotPosDelay = 50;//ms
  47.         DateTime BotPosTimestamp = DateTime.Now;
  48.  
  49.         bool Initialized = false;
  50.         byte InitializePhase = 0;
  51.         double InitializeDelay = 5000;
  52.         DateTime InitTimeStamp = DateTime.Now;
  53.  
  54.         Queue<string> HelpMsgIRC = new Queue<string>();
  55.         Queue<string> HelpMsgSS = new Queue<string>();
  56.         Queue<string> IntroMsgSS = new Queue<string>();
  57.  
  58.         // Main game timer
  59.         System.Timers.Timer MainGameTimer = new System.Timers.Timer();
  60.  
  61.         // queue to hold biller commands - to prevent from getting kicked for flooding
  62.         Queue<EventArgs> BillerCmdQ = new Queue<EventArgs>();
  63.         double BillerCmdDelay = 500;
  64.         DateTime BillerCmdTimeStamp = DateTime.Now;
  65.  
  66.         //-------------------- IRC
  67.         bool relaySSLogin = false;
  68.         // tag that goes before relayed messages in irc and ss
  69.         string ircPrefix = "";
  70.         string ssPrefix = "";
  71.         // Main IRC Class
  72.         public static IrcClient irc = new IrcClient();
  73.         // Login info
  74.         string MyNick, MyPassword, MyChannel, MyDescription, MyServer;
  75.         int MyPort = 6667;
  76.         bool IRCBridgeOn = true;
  77.         bool IRCreconnect = false;
  78.         double IRCreconnectDelay = 5;//sec
  79.         DateTime IRCTimestamp = DateTime.Now;
  80.         int IRCSendDelay = 50;//ms
  81.         DateTime ToggleTimestamp = DateTime.Now;
  82.         double ToggleDelay = 20;
  83.         // Irc command list
  84.         string[] IRCCommand = new string[6];
  85.         string[] IRCCommandDesc = new string[6];
  86.         string DoubleMsgCheckSS = "";
  87.         string DoubleMsgCheckIRC = "";
  88.         string BillerMsgCheckIRC = "";
  89.         byte irc_seq = 0;
  90.         DateTime TS_RefreshIRC = DateTime.Now;
  91.         double Delay_RefreshIRC = 1500;//ms
  92.         // Q's to hold the chat events
  93.         Queue<ChatEvent> SSChatQ = new Queue<ChatEvent>();
  94.         Queue<MyIrcMsg> IrcChatQ = new Queue<MyIrcMsg>();
  95.         class MyIrcMsg
  96.         {
  97.             public MyIrcMsg(SendType SType, string SendTo, string Message)
  98.             {
  99.                 this._SType = SType;
  100.                 this._SendTo = SendTo;
  101.                 this._Message = Message;
  102.             }
  103.  
  104.             private SendType _SType;
  105.             public SendType SType { get { return _SType; } }
  106.  
  107.             private string _SendTo;
  108.             public string SendTo { get { return _SendTo; } }
  109.  
  110.             private string _Message;
  111.             public string Message { get { return _Message; } }
  112.         }
  113.         public enum ColorCode
  114.         {
  115.             White = 0,   /**< White */
  116.             Black = 1,   /**< Black */
  117.             DarkBlue = 2,   /**< Dark blue */
  118.             DarkGreen = 3,   /**< Dark green */
  119.             Red = 4,   /**< Red */
  120.             DarkRed = 5,   /**< Dark red */
  121.             DarkViolet = 6,   /**< Dark violet */
  122.             Orange = 7,   /**< Orange */
  123.             Yellow = 8,   /**< Yellow */
  124.             LightGreen = 9,   /**< Light green */
  125.             Cyan = 10,   /**< Cornflower blue */
  126.             LightCyan = 11,   /**< Light blue */
  127.             Blue = 12,   /**< Blue */
  128.             Violet = 13,   /**< Violet */
  129.             DarkGray = 14,   /**< Dark gray */
  130.             LightGray = 15   /**< Light gray */
  131.         }
  132.         //-------------------- Database
  133.         private MySqlConnection connection;
  134.         // connections strings
  135.         private string server, database, uid, password, tablename;
  136.         bool PrivateFreqs = false;
  137.         int PublicFreqs = 99;
  138.         double DBUpdateInterval = 5;
  139.         DateTime DBUpdateTimestamp = DateTime.Now;
  140.  
  141.         // Lists to compare for arena update
  142.         List<SQLPlayer> ServerList = new List<SQLPlayer>();
  143.         List<SQLPlayer> CurrentList = new List<SQLPlayer>();
  144.  
  145.         class SQLPlayer
  146.         {
  147.             public SQLPlayer(string name, string status, int frequency)
  148.             {
  149.                 this._name = name;
  150.                 this._status = status;
  151.                 this._frequency = frequency;
  152.             }
  153.             public SQLPlayer(string name, string status, int frequency, bool delete)
  154.             {
  155.                 this._name = name;
  156.                 this._status = status;
  157.                 this._frequency = frequency;
  158.                 this._delete = delete;
  159.             }
  160.             private string _name;
  161.             public string name
  162.             {
  163.                 get { return _name; }
  164.                 set { _name = value; }
  165.             }
  166.             private string _status;
  167.             public string status
  168.             {
  169.                 get { return _status; }
  170.                 set { _status = value; }
  171.             }
  172.             private int _frequency;
  173.             public int frequency
  174.             {
  175.                 get { return _frequency; }
  176.                 set { _frequency = value; }
  177.             }
  178.             private bool _delete = true;
  179.             public bool delete
  180.             {
  181.                 get { return _delete; }
  182.                 set { _delete = value; }
  183.             }
  184.         }
  185.  
  186.  
  187.         // ---------------------------------------------------------  TIMER FUNCTIONS   ||
  188.         // -----------------------------------------------------------------------------//
  189.         public void GameTimer(object source, ElapsedEventArgs e)
  190.         {
  191.             if ((DateTime.Now - BotPosTimestamp).TotalMilliseconds > BotPosDelay)
  192.             {
  193.                 BotPosTimestamp = DateTime.Now;
  194.                 Game(BotPos);
  195.             }
  196.  
  197.             if ((DateTime.Now - BillerCmdTimeStamp).TotalMilliseconds > BillerCmdDelay)
  198.             {
  199.                 BillerCmdTimeStamp = DateTime.Now;
  200.                 if (BillerCmdQ.Count > 0)
  201.                 {
  202.                     EventArgs eA = BillerCmdQ.Dequeue();
  203.                     if (!(eA is ChatEvent) || (eA is ChatEvent && (eA as ChatEvent).Message != BillerMsgCheckIRC))
  204.                     {
  205.                         if (eA is ChatEvent)BillerMsgCheckIRC = (eA as ChatEvent).Message;
  206.                         Game(eA);
  207.                     }
  208.                 }
  209.             }
  210.  
  211.             if (!Initialized)
  212.             {
  213.                 if ((DateTime.Now - InitTimeStamp).TotalMilliseconds > InitializeDelay)
  214.                 {
  215.                     InitTimeStamp = DateTime.Now;
  216.                     InitializeBot();
  217.                 }
  218.                 return;
  219.             }
  220.  
  221.             if ((DateTime.Now - DBUpdateTimestamp).TotalSeconds > DBUpdateInterval)
  222.             {
  223.                 DBUpdateTimestamp = DateTime.Now;
  224.                 SendCommands(UpdateDB());
  225.             }
  226.  
  227.             if (IRCreconnect)
  228.             {
  229.                 if (!irc.IsConnected && (DateTime.Now - IRCTimestamp).TotalSeconds > IRCreconnectDelay)
  230.                 {
  231.                     IRCTimestamp = DateTime.Now;
  232.                     IRCreconnect = false;
  233.                     ConnectIRC();
  234.                 }
  235.                 return;
  236.             }
  237.  
  238.             if (IRCBridgeOn && (DateTime.Now - TS_RefreshIRC).TotalMilliseconds > Delay_RefreshIRC)
  239.             {
  240.                 TS_RefreshIRC = DateTime.Now;
  241.                 //irc.SendMessage(SendType.Message, MyNick, "refresh");
  242.             }
  243.  
  244.             if (IRCBridgeOn && (DateTime.Now - IRCTimestamp).TotalMilliseconds > IRCSendDelay)
  245.             {
  246.                 irc_seq++;
  247.                 IRCTimestamp = DateTime.Now;
  248.  
  249.                 if (irc_seq > 2) irc_seq = 0;
  250.  
  251.                 if (irc_seq == 1)
  252.                 {
  253.                     while(SSChatQ.Count > 0)
  254.                         Game(SSChatQ.Dequeue());
  255.                     return;
  256.                 }
  257.                 if (irc_seq == 0)
  258.                 {
  259.                     while (IrcChatQ.Count > 0)
  260.                     {
  261.                         MyIrcMsg m = IrcChatQ.Dequeue();
  262.                         irc.SendMessage(m.SType, m.SendTo, m.Message);
  263.                     }
  264.                     return;
  265.                 }
  266.                 if (irc_seq == 2)
  267.                 {
  268.                     irc.ListenOnce();
  269.                     return;
  270.                 }
  271.             }
  272.         }
  273.  
  274.         // ------------------------------------------------------  DATABASE FUNCTIONS   ||
  275.         // -----------------------------------------------------------------------------//
  276.         public Queue<EventArgs> ResetDatabase()
  277.         {
  278.             Queue<EventArgs> q = new Queue<EventArgs>();
  279.  
  280.             doSQLCommand(q, "TRUNCATE table " + tablename + ";");
  281.             doSQLCommand(q, "ALTER TABLE " + tablename + " AUTO_INCREMENT = 1;");
  282.             q.Enqueue(msg.chan(1, "Website arena list has been cleared."));
  283.  
  284.             return q;
  285.         }
  286.         private SQLPlayer GetPlayer(string name, List<SQLPlayer> list)
  287.         {
  288.             for (int i = 0; i < list.Count; i += 1)
  289.                 if (name == list[i].name) return list[i];
  290.  
  291.             // Ganna try and add a safety in case bot missed player enter
  292.             PlayerInfoEvent pI = new PlayerInfoEvent();
  293.             pI.Players.Add(name);
  294.             BillerCmdQ.Enqueue(pI);
  295.  
  296.             return null;
  297.         }
  298.         public Queue<EventArgs> UpdateDB()
  299.         {
  300.             Queue<EventArgs> q = new Queue<EventArgs>();
  301.  
  302.             // Resetting bools for update to know who is extra
  303.             for (int i = 0; i < ServerList.Count; i += 1)
  304.                 ServerList[i].delete = true;
  305.  
  306.             for (int i = 0; i < CurrentList.Count; i += 1)
  307.             {
  308.                 SQLPlayer CPlayer = CurrentList[i];
  309.                 SQLPlayer SPlayer = GetPlayer(CurrentList[i].name, ServerList);
  310.  
  311.                 // Checking to see if the server list has player
  312.                 if (SPlayer == null)
  313.                 {
  314.  
  315.                     // send sql to add row
  316.                     doSQLCommand(q, "INSERT INTO " + tablename + " (playername,status,frequency) VALUES('" + CPlayer.name + "', '" + CPlayer.status + "', '" + CPlayer.frequency + "');");
  317.                     //add player to server - SET DELETE TO FALSE ON SERVERLIST
  318.                     ServerList.Add(new SQLPlayer(CPlayer.name, CPlayer.status, CPlayer.frequency, false));
  319.                     //q.Enqueue(msg.chan(1, "Adding Player: [ " + CPlayer.name + " ]"));
  320.                 }
  321.                 else
  322.                 {
  323.                     // Making sure we dont delete name
  324.                     SPlayer.delete = false;
  325.  
  326.                     if (CPlayer.status != SPlayer.status || CPlayer.frequency != SPlayer.frequency)
  327.                     {
  328.                         // Check to see if player needs to be updated - SET DELETE TO FALSE ON SERVERLIST even if no update is needed
  329.                         doSQLCommand(q, "UPDATE " + tablename + " SET status='" + CPlayer.status + "', frequency='" + CPlayer.frequency + "' WHERE playername='" + CPlayer.name + "';");
  330.                         SPlayer.status = CPlayer.status;
  331.                         SPlayer.frequency = CPlayer.frequency;
  332.                         //q.Enqueue(msg.chan(1, "Info mismatch on server. Updating Player: [ " + CPlayer.name + " ]"));
  333.                     }
  334.                 }
  335.             }
  336.  
  337.             // checking to see if there are extra players on the server list - they will have delete set to true
  338.             for (int i = 0; i < ServerList.Count; i += 1)
  339.             {
  340.                 if (ServerList[i].delete)
  341.                 {
  342.                     //q.Enqueue(msg.chan(1, "Deleting Player: [ " + ServerList[i].name + " ]"));
  343.                     // send sql to remove row
  344.                     doSQLCommand(q, "DELETE FROM " + tablename + " WHERE  playername='" + ServerList[i].name + "';");
  345.                     // remove player from server list
  346.                     ServerList.RemoveAt(i);
  347.                 }
  348.             }
  349.             return q;
  350.         }
  351.         private void doSQLCommand(Queue<EventArgs> q, string c)
  352.         {
  353.             if (connection.State == System.Data.ConnectionState.Closed) OpenConnection(q);
  354.             MySqlCommand cmd = new MySqlCommand(c, connection);
  355.  
  356.             try { cmd.ExecuteNonQuery(); }
  357.             catch (MySqlException x)
  358.             { q.Enqueue(msg.chan(1, "doSQLCommand ERROR: " + x)); }
  359.  
  360.             CloseConnection(q);
  361.         }
  362.         //open connection to database
  363.         private bool OpenConnection(Queue<EventArgs> q)
  364.         {
  365.             try
  366.             {
  367.                 connection.Open();
  368.                 return true;
  369.             }
  370.             catch (MySqlException ex)
  371.             {
  372.                 //When handling errors, you can your application's response based
  373.                 //on the error number.
  374.                 //The two most common error numbers when connecting are as follows:
  375.                 //0: Cannot connect to server.
  376.                 //1045: Invalid user name and/or password.
  377.                 switch (ex.Number)
  378.                 {
  379.                     case 0:
  380.                         q.Enqueue(msg.chan(1, "Cannot connect to server.  Contact administrator"));
  381.                         break;
  382.  
  383.                     case 1045:
  384.                         q.Enqueue(msg.chan(1, "Invalid username/password, please try again"));
  385.                         break;
  386.                     default:
  387.                         q.Enqueue(msg.chan(1, "Error: Num[" + ex.Number + "]"));
  388.                         break;
  389.                 }
  390.                 return false;
  391.             }
  392.         }
  393.         //Close connection
  394.         private bool CloseConnection(Queue<EventArgs> q)
  395.         {
  396.             try
  397.             {
  398.                 connection.Close();
  399.                 //q.Enqueue(msg.chan(1, "Connection Closed."));
  400.                 return true;
  401.             }
  402.             catch (MySqlException ex)
  403.             {
  404.                 q.Enqueue(msg.arena(ex.Message));
  405.                 return false;
  406.             }
  407.         }
  408.  
  409.         // ------------------------------------------------  INCOMING SUBSPACE EVENTS   ||
  410.         // -----------------------------------------------------------------------------//
  411.         // Monitor all incoming chat
  412.         public void MonitorChatEvents(object sender, ChatEvent c)
  413.         {
  414.             if (c.ChatType == ChatTypes.Private && c.Message.StartsWith("@BotInfo@"))
  415.             {
  416.                 // Catch and store bot info that core sends
  417.                 string[] data = c.Message.Split(':');
  418.                 BotName = data[1];
  419.                 Arena = data[2];
  420.                 // initialize bot and load cfg from file
  421.                 InitializeBot();
  422.             }
  423.             else
  424.             {
  425.                 // spam control
  426.                 if (c.Message == DoubleMsgCheckSS)
  427.                     return;
  428.                 DoubleMsgCheckSS = c.Message;
  429.  
  430.                 if (AllowedMessage(c.Message))
  431.                     ProcessIncomingSSMsg(c);
  432.                 else
  433.                     ProcessIncomingSSCommand(c);
  434.             }
  435.         }
  436.  
  437.         // For freqchange event
  438.         public void FreqChange(object sender, TeamChangeEvent t)
  439.         {
  440.             SQLPlayer player = GetPlayer(t.PlayerName, CurrentList);
  441.             if (player != null)
  442.                 player.frequency = GetFreq(t.Frequency);
  443.             else
  444.                 Game(msg.arena("FreqChange Error - Player not returned from GetPlayer()."));
  445.         }
  446.  
  447.         // For shipchange event
  448.         public void ShipChange(object sender, ShipChangeEvent s)
  449.         {
  450.             SQLPlayer player = GetPlayer(s.PlayerName, CurrentList);
  451.             if (player != null)
  452.                 GetPlayer(s.PlayerName, CurrentList).status = s.ShipType.ToString();
  453.             else
  454.                 Game(msg.arena("ShipChange Error - Player not returned from GetPlayer()."));
  455.         }
  456.  
  457.         // For player enter evenT
  458.         public void PlayerEntered(object sender, PlayerEnteredEvent p)
  459.         {
  460.             if (relaySSLogin)
  461.                 IrcChatQ.Enqueue(new MyIrcMsg(SendType.Notice, MyChannel, "\x03" + (int)ColorCode.DarkGreen + "[ " + p.PlayerName + " ] has just entered arena."));
  462.  
  463.             SQLPlayer player = GetPlayer(p.PlayerName, CurrentList);
  464.             if (player == null)
  465.                 CurrentList.Add(new SQLPlayer(p.PlayerName, p.ShipType.ToString(), GetFreq(p.Frequency)));
  466.         }
  467.  
  468.         // Player left event
  469.         public void PlayerLeft(object sender, PlayerLeftEvent p)
  470.         {
  471.             if (relaySSLogin)
  472.                 IrcChatQ.Enqueue(new MyIrcMsg(SendType.Notice, MyChannel, "\x03" + (int)ColorCode.DarkGreen + "[ " + p.PlayerName + " ] has just left arena."));
  473.             CurrentList.Remove(GetPlayer(p.PlayerName, CurrentList));    
  474.         }
  475.  
  476.         public void PlayerInfoEvent(object sender, PlayerInfoEvent p)
  477.         {
  478.             for (int i = 0; i < p.PlayerList.Count; i += 1)
  479.             {
  480.                 if (GetPlayer(p.PlayerList[i].PlayerName, CurrentList) == null)
  481.                 {
  482.                     CurrentList.Add(new SQLPlayer(p.PlayerList[i].PlayerName, p.PlayerList[i].Ship.ToString(), GetFreq(p.PlayerList[i].Frequency)));
  483.                     BillerCmdQ.Enqueue(msg.chan(1, "Player Info was sent and received for [" + p.PlayerList[i].PlayerName + "]. Error was handled?"));
  484.                 }
  485.             }
  486.         }
  487.         // ---------------------------------------------------  IRC FUNCTIONS/ EVENTS   ||
  488.         // -----------------------------------------------------------------------------//
  489.  
  490.         public void ConnectIRC()
  491.         {
  492.             //Setup
  493.             irc.Encoding = System.Text.Encoding.UTF8;
  494.             irc.SendDelay = IRCSendDelay * 3;
  495.             irc.AutoRetry = true;
  496.             irc.ActiveChannelSyncing = true;
  497.  
  498.             //Event Handlers
  499.             irc.OnJoin += new JoinEventHandler(irc_OnJoin);
  500.             irc.OnError += new Meebey.SmartIrc4net.ErrorEventHandler(irc_OnError);
  501.             irc.OnConnected += new EventHandler(irc_OnConnected);
  502.             irc.OnRawMessage += new IrcEventHandler(OnRawMessage);
  503.             irc.OnDisconnecting += new EventHandler(OnDisco);
  504.             irc.OnQuit += new QuitEventHandler(OnQuit);
  505.             irc.OnKick += new KickEventHandler(irc_OnKick);
  506.             irc.OnBan += new BanEventHandler(irc_OnKick);
  507.             irc.OnUnban += new UnbanEventHandler(irc_OnKick);
  508.  
  509.             try
  510.             {
  511.                 //Connect, log in
  512.                 irc.Connect(MyServer, MyPort);
  513.                 irc.Login(MyNick, MyDescription);
  514.                 BillerCmdQ.Enqueue(msg.chan(1,"IRC Connected."));
  515.                 IRCJoinChan();
  516.             }
  517.             catch (Exception e)
  518.             {
  519.                 BillerCmdQ.Enqueue(msg.chan(1, "IRC Login: " + "Could not connect, exception:" + Environment.NewLine
  520.                     + e.Message + Environment.NewLine
  521.                     + e.ToString()));
  522.             }
  523.         }
  524.  
  525.         public void DisconnectIRC()
  526.         {    irc.Disconnect();   }
  527.  
  528.         public void IRCJoinChan()
  529.         {
  530.             irc.RfcJoin(MyChannel);
  531.             irc.SendMessage(SendType.Message, "nickserv", "identify " + MyPassword);
  532.             BillerCmdQ.Enqueue(msg.chan(1, "IRC Joined channel[ "+MyChannel+" ]."));
  533.         }
  534.  
  535.         // Connection confirmation
  536.         public void irc_OnConnected(object sender, EventArgs e)
  537.         {
  538.         }
  539.  
  540.         // ERROR message
  541.         public void irc_OnError(object sender, Meebey.SmartIrc4net.ErrorEventArgs e)
  542.         {
  543.         }
  544.  
  545.         // irc join event
  546.         public void irc_OnJoin(object sender, IrcEventArgs e)
  547.         {
  548.         }
  549.  
  550.         public void irc_OnKick(object sender, IrcEventArgs e)
  551.         {
  552.         }
  553.  
  554.         public void OnQuit(object sender, IrcEventArgs e)
  555.         {
  556.         }
  557.  
  558.         public void OnDisco(object sender, EventArgs e)
  559.         {
  560.             irc.RfcPing(MyServer);
  561.             IRCreconnect = true;
  562.             BillerCmdQ.Enqueue(msg.chan(1, "Connection lost, attempting to reconnect in (" + IRCreconnectDelay + ") seconds"));
  563.         }
  564.  
  565.         // this method will get all IRC messages
  566.         public void OnRawMessage(object sender, IrcEventArgs e)
  567.         {
  568.             if (e.Data.Message == null)
  569.                 return;
  570.  
  571.             string sentmsg = StripFormat(e.Data.Message);
  572.  
  573.             if (sentmsg == DoubleMsgCheckIRC)
  574.                 return;
  575.  
  576.             DoubleMsgCheckIRC = sentmsg;
  577.  
  578.             if (e.Data.Type == ReceiveType.ChannelMessage)
  579.                 if (AllowedMessage(sentmsg))
  580.                     ProcessIncomingIRCMsg(e);
  581.                 else if (sentmsg.StartsWith("!") || sentmsg.StartsWith("."))
  582.                     ProcessIncomingIRCCommand(e);
  583.         }
  584.         public void ProcessIncomingIRCMsg(IrcEventArgs e)
  585.         {
  586.             if (e.Data.Type == ReceiveType.ChannelMessage)
  587.                 SSChatQ.Enqueue(msg.pub( ssPrefix + " " + e.Data.Nick + "> " + StripFormat(e.Data.Message)));
  588.         }
  589.         private void ProcessIncomingSSMsg(ChatEvent c)
  590.         {
  591.             if (c.ChatType == ChatTypes.Public)
  592.                 IrcChatQ.Enqueue(new MyIrcMsg(SendType.Message, MyChannel, "\x03" + (int)ColorCode.Blue + ircPrefix + " " + c.PlayerName + "> " + c.Message));
  593.         }
  594.         public void ProcessIncomingIRCCommand(IrcEventArgs e)
  595.         {
  596.             if (!Initialized)
  597.                 return;
  598.  
  599.             // strip format and color from message
  600.             string message = StripFormat(e.Data.Message).Trim().Remove(0, 1);
  601.             // in case only a command is set we make: command = message
  602.             string command = message;
  603.             // placeholder for a compound command: to hold name or message
  604.             string info = "~none~";
  605.  
  606.             // set compound variables here
  607.             if (message.Contains(' '))
  608.             {
  609.                 command = message.Split(' ')[0];
  610.                 info = message.Remove(0, command.Length).Trim();
  611.             }
  612.  
  613.             // process command
  614.             if (command.ToLower().Equals("help"))
  615.                 if (!info.Equals("~none~"))
  616.                     SSChatQ.Enqueue(msg.pub("?help " + "[IRCHelp] ( "+ e.Data.Nick +" ) " + info));
  617.                 else
  618.                     doHelpIRCMessage(HelpMsgIRC, e.Data.Nick);
  619.         }
  620.         private void ProcessIncomingSSCommand(ChatEvent c)
  621.         {
  622.             if (!Initialized)
  623.                 return;
  624.  
  625.             if (c.Message.StartsWith("!") || c.Message.StartsWith("."))
  626.             {
  627.                 string command = c.Message.Trim().ToLower().Remove(0, 1);
  628.  
  629.                 if (command.Contains(" "))
  630.                 {
  631.                     // Parse command and name from command
  632.                     command = command.Trim().Split(' ')[0];
  633.                     string ircNick = c.Message.Trim().Remove(0, command.Length + 1).Trim();
  634.  
  635.                     if (command.Equals(IRCCommand[0]) || command.Equals(IRCCommand[1]) || command.Equals(IRCCommand[2]))
  636.                     {
  637.                         // Don't allow if they arent a mod.
  638.                         if (!isMod(c)) return;
  639.                         // Do the command on irc
  640.                         doIrcCommand(command, ircNick);
  641.                     }
  642.                 }
  643.                 else if (command.Equals(IRCCommand[3]))
  644.                     doToggle(c);
  645.                 else if (command.Equals(IRCCommand[4]))
  646.                     doStatus(c);
  647.                 else if (command.Equals(IRCCommand[5]))
  648.                     doCmdList(c);
  649.                 else if (command.Equals("help"))
  650.                     doHelpSSMessage(HelpMsgSS, c.PlayerName);
  651.                 else if ((command.StartsWith(IRCCommand[0]) || (command.StartsWith(IRCCommand[1]) || command.Equals(IRCCommand[2]))))
  652.                     Game(msg.pm(c.PlayerName, "Syntax for command= !command [PlayerName]        EXAMPLE: !" + IRCCommand[0] + " PsyOps    (or)     !" + IRCCommand[1] + " PsyOps"));
  653.             }
  654.         }
  655.         private bool isMod(ChatEvent c)
  656.         {
  657.             if (c.ModLevel >= ModLevels.Sysop)
  658.                 return true;
  659.  
  660.             Game(msg.pm(c.PlayerName, "Only staff members are allowed to use this command."));
  661.             return false;
  662.         }
  663.         public void doCmdList(ChatEvent c)
  664.         {
  665.             Game(msg.pm(c.PlayerName, "./--------------------<[ IRCWeb Bot Command List ]--------------------\\"));
  666.             Game(msg.pm(c.PlayerName, "|          Any of these commands can be started with . or !            |"));
  667.             Game(msg.pm(c.PlayerName, ".\\----------+---------------------------------------------------------/"));
  668.             Game(msg.pm(c.PlayerName, " "));
  669.             for (int i = 0; i < IRCCommand.Length; i += 1 )
  670.             {
  671.                 Game(msg.pm(c.PlayerName, "  " + IRCCommand[i].PadRight(11, ' ') + "|  " + IRCCommandDesc[i].PadRight(59, ' ')));
  672.             }
  673.             Game(msg.pm(c.PlayerName, " "));
  674.             Game(msg.pm(c.PlayerName, ".>--------------------------------------------------------------------<"));
  675.             Game(msg.pm(c.PlayerName, "/ Commands like " + (IRCCommand[0] + ", " + IRCCommand[1] + ", and " + IRCCommand[2] + " need a playername to follow").PadRight(55, ' ') + "\\"));
  676.             Game(msg.pm(c.PlayerName, "\\                    EXAMPLE :      !" + IRCCommand[0] + " PsyOps                       /"));
  677.         }
  678.         public void doStatus(ChatEvent c)
  679.         {
  680.             if (IRCBridgeOn)
  681.             {
  682.                 Game(msg.pm(c.PlayerName, "Irc Status. Bridge[ Active ] Server[ " + MyServer + " ] Channel[ " + MyChannel + " ] IRCBot[ " + MyNick + " ]"));
  683.  
  684.                 int userint = 0;
  685.                 string userlist = "IRC User Chat List: ";
  686.  
  687.                 // Return chatter list
  688.                 Meebey.SmartIrc4net.Channel chan = irc.GetChannel(MyChannel);
  689.                 foreach (Meebey.SmartIrc4net.ChannelUser user in chan.Users.Values)
  690.                 {
  691.                     userint++;
  692.                     userlist += user.IrcUser.Nick + ", ";
  693.                 }
  694.  
  695.                 userlist = userlist.Remove(userlist.Length - 2, 2);
  696.  
  697.                 Game(msg.pm(c.PlayerName, userlist));
  698.                 return;
  699.             }
  700.             Game(msg.pm(c.PlayerName, "Irc Status. Bridge[ Off ]"));
  701.         }
  702.         public void doToggle(ChatEvent c)
  703.         {
  704.             if (!isMod(c))
  705.                 return;
  706.  
  707.             if ((DateTime.Now - ToggleTimestamp).TotalSeconds > ToggleDelay)
  708.                 ToggleTimestamp = DateTime.Now;
  709.             else
  710.             {
  711.                 Game(msg.pm(c.PlayerName, "Toggle delay set to [ Off ]seconds. Please try again in [ " + Math.Ceiling(ToggleDelay - (DateTime.Now - ToggleTimestamp).TotalSeconds) + " ]seconds."));
  712.                 return;
  713.             }
  714.  
  715.             IRCBridgeOn = !IRCBridgeOn;
  716.  
  717.             if (!IRCBridgeOn)
  718.             {
  719.                 DisconnectIRC();
  720.                 IRCreconnect = false;
  721.             }
  722.             else
  723.                 ConnectIRC();
  724.  
  725.             BillerCmdQ.Enqueue(msg.chan(1,"IRC Bridge has been toggled [ On ]."));
  726.         }
  727.         private void doIrcCommand(string command, string ircNick)
  728.         {
  729.             irc.SendMessage(SendType.Message, "chanserv", command + " " + MyChannel + " " + ircNick);
  730.         }
  731.         private void doHelpIRCMessage(Queue<string> q, string nick)
  732.         {
  733.             Queue<string> reply = new Queue<string>(q.ToArray());
  734.             for (int i = 0; i < q.Count; i += 1)
  735.                 //IrcChatQ.Enqueue(new MyIrcMsg(SendType.Message, nick, reply.Dequeue()));
  736.                 irc.SendMessage(SendType.Message, nick , reply.Dequeue());
  737.         }
  738.         private void doHelpSSMessage(Queue<string> q, string player)
  739.         {
  740.             Queue<string> reply = new Queue<string>(q.ToArray());
  741.             for (int i = 0; i < q.Count; i += 1)
  742.                 Game(msg.pm(player, reply.Dequeue()));
  743.         }
  744.         // ------------------------------------------------  INITIALIZE BOT FUNCTIONS   ||
  745.         // -----------------------------------------------------------------------------//
  746.         public void InitializeBot()
  747.         {
  748.             switch (InitializePhase)
  749.             {
  750.                 case 0:
  751.                     StartGameTimer();
  752.                     break;
  753.                 case 1:
  754.                     loadCFG();
  755.                     break;
  756.                 case 2:
  757.                     SendCommands(ResetDatabase());
  758.                     InitializePhase++;
  759.                     break;
  760.                 case 3:
  761.                     ConnectIRC();
  762.                     InitializePhase++;
  763.                     break;
  764.                 case 4:
  765.                     Queue<string> reply = new Queue<string>(IntroMsgSS.ToArray());
  766.                     for (int i = 0; i < IntroMsgSS.Count; i += 1)
  767.                         Game(msg.arena(reply.Dequeue()));
  768.                     BillerCmdQ.Enqueue(msg.chan(1, "[ " + BotName + " ] is now initialized."));
  769.                     Initialized = true;
  770.                     InitializePhase++;
  771.                     break;
  772.             }
  773.         }
  774.         public void StartGameTimer()
  775.         {
  776.             // Configure and start main game timer
  777.             MainGameTimer.Elapsed += new ElapsedEventHandler(GameTimer);
  778.             MainGameTimer.Interval = 50;
  779.             MainGameTimer.Start();//and start it
  780.             InitializePhase++;
  781.         }
  782.         public void loadCFG()
  783.         {
  784.             string fileToLoad = BotName + "/IRCWeb.cfg";
  785.  
  786.             // Looking for the CFG file
  787.             if (File.Exists(fileToLoad))
  788.             {
  789.                 try
  790.                 {   //Opening appropriate file
  791.                     StreamReader SR = File.OpenText(fileToLoad);
  792.                     //used to read each line
  793.                     string S;
  794.                     while ((S = SR.ReadLine()) != null)
  795.                     {
  796.                         // making sure it is a properly formatted setting
  797.                         if (!S.StartsWith(";") && S.Contains(":"))
  798.                         {
  799.                             string[] info = S.Trim().Split(':');
  800.  
  801.                             switch (info[0])
  802.                             {
  803.                                 case "cmdirc0": IRCCommand[0] = info[1]; break;
  804.                                 case "cmddesc0": IRCCommandDesc[0] = info[1]; break;
  805.                                 case "cmdirc1": IRCCommand[1] = info[1]; break;
  806.                                 case "cmddesc1": IRCCommandDesc[1] = info[1]; break;
  807.                                 case "cmdirc2": IRCCommand[2] = info[1]; break;
  808.                                 case "cmddesc2": IRCCommandDesc[2] = info[1]; break;
  809.                                 case "cmdirc3": IRCCommand[3] = info[1]; break;
  810.                                 case "cmddesc3": IRCCommandDesc[3] = info[1]; break;
  811.                                 case "cmdirc4": IRCCommand[4] = info[1]; break;
  812.                                 case "cmddesc4": IRCCommandDesc[4] = info[1]; break;
  813.                                 case "cmdirc5": IRCCommand[5] = info[1]; break;
  814.                                 case "cmddesc5": IRCCommandDesc[5] = info[1]; break;
  815.                                 case "ssloginrelay": relaySSLogin = ReturnBool(info[1]); break;
  816.                                 case "irctagprefix": ircPrefix = info[1]; break;
  817.                                 case "sstagprefix": ssPrefix = info[1]; break;
  818.                                 case "ircreconnectdelay": IRCreconnectDelay = double.Parse(info[1]); break;
  819.                                 case "intromsg": IntroMsgSS.Enqueue(info[1]); break;
  820.                                 case "irchelp": HelpMsgIRC.Enqueue(info[1]); break;
  821.                                 case "sshelp": HelpMsgSS.Enqueue(info[1]); break;
  822.                                 case "billermessagedelay": BillerCmdDelay = double.Parse(info[1]); break;
  823.                                 case "hideprivatefreqs": PrivateFreqs = ReturnBool(info[1]); break;
  824.                                 case "publicfreqs": PublicFreqs = int.Parse(info[1]); break;
  825.                                 case "botchats": Game(msg.pub("?chat=" + info[1])); break;
  826.                                 case "ircnick": MyNick = info[1]; break;
  827.                                 case "ircnickpass": MyPassword = info[1]; break;
  828.                                 case "ircchannel": MyChannel = info[1]; break;
  829.                                 case "ircnickdescription": MyDescription = info[1]; break;
  830.                                 case "ircserver": MyServer = info[1]; break;
  831.                                 case "ircport": MyPort = int.Parse(info[1]); break;
  832.                                 case "ircsenddelay": IRCSendDelay = int.Parse(info[1]); break;
  833.                                 case "dbupdateinterval": DBUpdateInterval = double.Parse(info[1]); break;
  834.                                 case "dbtablename": tablename = info[1]; break;
  835.                                 case "dbserver": server = info[1]; break;
  836.                                 case "dbname": database = info[1]; break;
  837.                                 case "dbuid": uid = info[1]; break;
  838.                                 case "dbpassword":
  839.                                     connection = new MySqlConnection("SERVER="
  840.                                     + server + ";" + "DATABASE=" + database
  841.                                     + ";" + "UID=" + uid + ";" + "PASSWORD=" + info[1] + ";");
  842.                                     break;
  843.                             }
  844.                         }
  845.                     }
  846.                     // Closing file
  847.                     SR.Close();
  848.                 }
  849.                 catch (Exception x)
  850.                 {
  851.                     Game(msg.arena("Error on file load: " + x));
  852.                 }
  853.             }
  854.             else
  855.             {
  856.                 Game(msg.arena("File NOT Found"));
  857.             }
  858.             BillerCmdQ.Enqueue(msg.chan(1,"IRCWeb.cfg file loaded."));
  859.             InitializePhase++;
  860.         }
  861.  
  862.         // -----------------------------------------------------------  MISC FUNTIONS   ||
  863.         // -----------------------------------------------------------------------------//
  864.         // A way of hidding private freqs
  865.         int GetFreq( ushort Freq)
  866.         {
  867.             if (!PrivateFreqs || Freq == 8025 || Freq <= PublicFreqs ) return (int)Freq;
  868.            
  869.             return 6969;
  870.         }
  871.         bool ReturnBool(string setting)
  872.         {
  873.             setting = setting.Trim().ToLower();
  874.             if (setting.Equals("yes") || setting.Equals("true")) return true;
  875.             return false;
  876.         }
  877.  
  878.         public void SendCommands(Queue<EventArgs> q)
  879.         {
  880.             while (q.Count > 0)
  881.             {
  882.                 EventArgs e = q.Dequeue();
  883.  
  884.                 if (!(e is ChatEvent))
  885.                 {
  886.                     Game(e);
  887.                     return;
  888.                 }
  889.  
  890.                 ChatEvent c = e as ChatEvent;
  891.  
  892.                 if (c.ChatType == ChatTypes.Channel || (c.ChatType == ChatTypes.Public && c.Message.StartsWith("?")))
  893.                     BillerCmdQ.Enqueue(c);
  894.                 else
  895.                     Game(c);
  896.             }
  897.         }
  898.  
  899.         // Making sure we dont relay commands: IRC => SS or vice versa
  900.         bool AllowedMessage(string m)
  901.         {
  902.             if (m.StartsWith("*") || m.StartsWith("?") || m.StartsWith("!") || m.StartsWith("/") || m.StartsWith(":") || m.StartsWith("."))
  903.                 return false;
  904.             return true;
  905.         }
  906.  
  907.         // Stripping any color code or fomat code - bold, underline, etc..
  908.         string StripFormat(string OriginalMessage)
  909.         {
  910.             if (OriginalMessage == null)
  911.                 return null;
  912.  
  913.             string ircmsg = new Regex(@"\x03(\d{1,2}(,\d{1,2})?)?").Replace(OriginalMessage, "").Trim();
  914.             ircmsg = ircmsg.Trim();
  915.             return ircmsg;
  916.         }
  917.  
  918.         public override void Dispose()
  919.         {
  920.             throw new NotImplementedException();
  921.         }
  922.     }
  923. }
Advertisement
Add Comment
Please, Sign In to add comment