示例#1
0
 public void AddRow(params object[] pColumns)
 {
     if (pColumns.Length != _columns.Count)
     {
         throw new Exception("Incorrect column count!");
     }
     _rows.Add(MySQL_Connection.BuildValuesRow(pColumns));
 }
示例#2
0
 public void SetWhereColumn(string pKey, object pValue)
 {
     _whereColumns.Add(pKey, MySQL_Connection.Escape(pValue));
 }
示例#3
0
        public override string ToString()
        {
            if (!HasRows())
            {
                throw new Exception("Row count = 0");
            }

            if (IgnoreDuplicates && OnDuplicateUpdate)
            {
                throw new Exception("Can't use both IgnoreDuplicates and OnDuplicateUpdate");
            }

            StringBuilder sb = new StringBuilder();

            sb.Append("INSERT " + (IgnoreDuplicates ? "IGNORE " : "") + "INTO\r\n\t" + this.TableName + "\r\n\t(");
            string[] columnlist = new string[_columns.Count];
            for (int i = 0; i < _columns.Count; i++)
            {
                columnlist[i] = "`" + _columns[i].Name + "`";
            }

            sb.Append(string.Join(", ", columnlist));
            sb.Append(")\r\nVALUES\r\n\t");

            List <string> tmp = new List <string>(_rows);

            if (_rowsColumnedCount > 0)
            {
                for (int j = 0; j < _columns.Count; j++)
                {
                    if (_rowsColumned[_columns[j].Name].Count != _rowsColumnedCount)
                    {
                        throw new Exception("Column " + _columns[j].Name + " did not have enough values!!!");
                    }
                }
                for (int i = 0; i < _rowsColumnedCount; i++)
                {
                    object[] inputobjects = new object[_columns.Count];
                    for (int j = 0; j < _columns.Count; j++)
                    {
                        inputobjects[j] = _rowsColumned[_columns[j].Name][i];
                    }
                    tmp.Add(MySQL_Connection.BuildValuesRow(inputobjects));
                }
            }

            sb.Append(string.Join(",\r\n\t", tmp));

            if (OnDuplicateUpdate)
            {
                List <string> updatecolumns = new List <string>();
                foreach (Column col in _columns.Where(c => { return(c.InUpdate); }))
                {
                    updatecolumns.Add(string.Format("`{0}` = VALUES(`{0}`)", col.Name));
                }

                if (updatecolumns.Count > 0)
                {
                    sb.Append("\r\nON DUPLICATE KEY UPDATE\r\n\t");
                    sb.Append(string.Join(",\r\n\t", updatecolumns.ToArray()));
                }
            }
            sb.Append(";");

            return(sb.ToString());
        }
示例#4
0
 public void AddRowUnsafe(params object[] pColumns)
 {
     // :(
     _rows.Add(MySQL_Connection.BuildValuesRow(pColumns));
 }
示例#5
0
        public static void HandleServerConnectionStatus(ClientConnection pConnection, MaplePacket pPacket)
        {
            if (pPacket.ReadBool())
            {
                string ip   = pPacket.ReadString();
                ushort port = pPacket.ReadUShort();
                pConnection.Logger_WriteLine("- Client got connection with MapleStory server @ {0}:{1}", ip, port);

                pConnection.ConnectedToIP   = ip;
                pConnection.ConnectedToPort = port;

                if (port == 8484)
                {
                    pConnection.SendInfoText("Mapler.me is awaiting account check! Happy mapling!");
                    var info = SessionRestartCache.Instance.GetInfoForConnection(pConnection);
                    if (info != null)
                    {
                        SessionRestartCache.Instance.RemoveInfo(info);
                    }


                    pConnection.ChannelID = 255;
                }
                else
                {
                    pConnection.SendInfoText("You successfully connected, or are in the Cash Shop!");
                }

                pConnection.ConnectedTimeToServer = MasterThread.CurrentDate;
            }
            else
            {
                pConnection.Logger_WriteLine("- Client lost connection with MapleStory server");
                pConnection.SendInfoText("Maplestory is closed, or not connected properly.");

                pConnection.ConnectedToIP   = "0.0.0.0";
                pConnection.ConnectedToPort = 0;

                if (pConnection.ConnectedTimeToServer != DateTime.MinValue)
                {
                    var timespan = MasterThread.CurrentDate - pConnection.ConnectedTimeToServer;
                    pConnection.Logger_WriteLine("Player was connected for {0}", timespan);

                    if (timespan.TotalSeconds < 5)
                    {
                        pConnection.Logger_WriteLine("CLIENT PROBABLY FAILED TO CONNECT!!!");
                    }

                    if (pConnection.CharData != null)
                    {
                        // Probably CC-ing or something. record

                        MySQL_Connection.Instance.RunQuery("INSERT INTO connection_log VALUES " + MySQL_Connection.BuildValuesRow(pConnection.AccountID, pConnection.CharacterInternalID, pConnection.ChannelID, pConnection.ConnectedTimeToServer, new MySQL_Connection.NowType()));
                    }
                }

                // Delete if there's session info
                var info = SessionRestartCache.Instance.GetInfoForConnection(pConnection);
                if (info != null)
                {
                    SessionRestartCache.Instance.RemoveInfo(info);
                }

                pConnection.CharData            = null;
                pConnection.CharacterInternalID = -1;
                pConnection.CharacterID         = -1;
                pConnection.ChannelID           = 255;
            }
        }
示例#6
0
        static void Main(string[] args)
        {
            AppDomain currentDomain = AppDomain.CurrentDomain;

            currentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnexpectedExHandler);
            Console.CancelKeyPress           += Console_CancelKeyPress;

            Logger.SetLogfile(false);

            MasterThread.Load("MPLRServer");

            try
            {
                MySQL_Connection.Initialize();
            }
            catch
            {
                Environment.Exit(12);
            }

            AccountDataCache.Initialize();
#if LOCALE_GMS
            GMSKeys.Initialize();
#endif

            CommandHandler.Initialize();
            Timeline.Init();

            Random = new System.Random();
            {
                InitializeValidHeaders();
                AcceptedIPs = new List <string>();
#if LOCALE_GMS
                AcceptedIPs.Add("8.31.9");     // GMS
#elif LOCALE_EMS
                AcceptedIPs.Add("109.234.77"); // EMS
#endif

                Clients = new List <ClientConnection>();
                StartPinger();
                StartCharacterDeleteQueue();
            }

            EXPTable.Load();

            SessionRestartCache.Start();

            // For clients
            Acceptor accept = new Acceptor(ServerMapleInfo.MAPLER_PORT, sock =>
            {
                new ClientConnection(sock);
            });

            // For online check!
            byte[] OnlineCheckInfo = null;
            {
                MaplePacket packet = new MaplePacket(ServerMapleInfo.VERSION);
                packet.WriteByte(ServerMapleInfo.LOCALE);

                byte[] temp = packet.ToArray();

                OnlineCheckInfo = new byte[temp.Length + 1];
                Buffer.BlockCopy(temp, 0, OnlineCheckInfo, 1, temp.Length);
                OnlineCheckInfo[0] = (byte)(temp.Length + 4);

                packet.Dispose();
                packet = null;
            }
            Acceptor acceptCheck = new Acceptor(ServerMapleInfo.MAPLER_PORT_SERVER_INFO, sock =>
            {
                sock.Send(OnlineCheckInfo);
                sock.Send(BitConverter.GetBytes(Clients.Count));
                sock.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                sock.Close();
            });


            Logger.WriteLine("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+");
            Logger.WriteLine("|                                             |");
            Logger.WriteLine("|              Mapler.me Server               |");
            Logger.WriteLine("|                                             |");
#if LOCALE_GMS
            Logger.WriteLine("|                   GLOBAL                    |");
#elif LOCALE_EMS
            Logger.WriteLine("|                   EUROPE                    |");
#elif LOCALE_KMS
            Logger.WriteLine("|                   KOREA                     |");
#endif
            Logger.WriteLine("|                                             |");
            Logger.WriteLine("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+");
            Logger.WriteLine("|           Build For: {0,3} Locale {1,1}           |", ServerMapleInfo.VERSION, ServerMapleInfo.LOCALE);
            Logger.WriteLine("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+");
            Logger.WriteLine("Accepting connections on {0}, and info requests on {1}", ServerMapleInfo.MAPLER_PORT, ServerMapleInfo.MAPLER_PORT_SERVER_INFO);


            while (true)
            {
                string cmd = Console.ReadLine();
                if (cmd == null)
                {
                    break;              // CTRL + C
                }
                string[] arguments = cmd.Split(' ');
                if (arguments.Length >= 1)
                {
                    switch (arguments[0])
                    {
#if LOCALE_GMS
                    case "getkeys":
                    {
                        GMSKeys.Initialize();
                        break;
                    }
#endif
                    case "reload_store":
                    {
                        MasterThread.Instance.AddCallback(a =>
                            {
                                AccountDataCache.Instance.Load();
                            });

                        break;
                    }

                    case "request_screenshots":
                    {
                        MasterThread.Instance.AddCallback(a =>
                            {
                                var tmp = new List <ClientConnection>(Clients);
                                foreach (var client in tmp)
                                {
                                    using (MaplePacket pack = new MaplePacket(MaplePacket.CommunicationType.ServerPacket, 0xEEFE))
                                    {
                                        pack.SwitchOver();
                                        client.SendPacket(pack);
                                    }
                                }
                            });

                        break;
                    }

                    case "testsession":
                    {
                        int  accountid  = arguments.Length > 1 ? Int32.Parse(arguments[1]) : -1;
                        bool raw        = arguments.Length > 2;
                        var  verp       = new MSBLoader();
                        var  connection = new ClientConnection(verp);
                        connection.AccountID = accountid;
                        verp.Parse("Savefile.msb", raw);

                        break;
                    }

                    case "players":
                    {
                        string names = string.Join(", ", Clients);
                        Console.WriteLine("Players online:\r\n{0}", names);
                        break;
                    }

                    case "close":
                    case "stop":
                    case "exit":
                    {
                        MasterThread.Instance.AddCallback(a =>
                            {
                                var tmp = new List <ClientConnection>(Clients);
                                foreach (var client in tmp)
                                {
                                    // client.Save(true, true);
                                    client.Disconnect();
                                }

                                MySQL_Connection.Instance.Stop = true;
                                MasterThread.Instance.Stop     = true;
                            });
                        break;
                    }

                    default:
                        Console.WriteLine("Command not found");
                        break;
                    }
                }
            }
        }