Beispiel #1
0
        public static bool CanUserAccess(this SharpStarClient client, string command, bool sendMsg = false)
        {
            if (client.IsAdmin())
            {
                return(true);
            }

            var cmds = SharpStarMain.Instance.PluginManager.CSPluginManager.Commands;

            var cmd = cmds.SingleOrDefault(p => p.Item1 == command);

            if (cmd == null || cmd.Item4)
            {
                return(false);
            }

            if (string.IsNullOrEmpty(cmd.Item3))
            {
                return(true);
            }

            bool hasPerm = client.Server.Player.HasPermission(cmd.Item3);

            if (!hasPerm && sendMsg)
            {
                client.SendChatMessage("Server", "You do not have permission to use this command!");
            }

            return(hasPerm);
        }
Beispiel #2
0
 public void CallEvent(string evtName, IPacket packet, SharpStarClient client, params object[] args)
 {
     foreach (IPlugin plugin in _plugins)
     {
         plugin.CallEvent(evtName, packet, client, args);
     }
 }
Beispiel #3
0
 public async Task CallEvent(IPacket packet, SharpStarClient client, bool isAfter = false)
 {
     foreach (ICSPlugin csPlugin in _csPlugins.Values.ToList())
     {
         await csPlugin.OnEventOccurred(packet, client, isAfter);
     }
 }
Beispiel #4
0
        public async Task OnEventOccurred(IPacket packet, SharpStarClient client, bool isAfter = false)
        {
            KnownPacket kp = (KnownPacket)packet.PacketId;

            if (!isAfter && !_registeredEvents.Contains(kp))
            {
                return;
            }

            if (isAfter && !_registeredAfterEvents.Contains(kp))
            {
                return;
            }

            try
            {
                foreach (List <CallablePacketEvent> evts in RegisteredPacketEventObjects.Values)
                {
                    foreach (CallablePacketEvent evt in evts)
                    {
                        if (evt.PacketType == kp && evt.IsAfter == isAfter)
                        {
                            if (evt.IsAsync)
                            {
                                var toCall = evt.ToCall as Func <IPacket, SharpStarClient, Task>;

                                if (toCall != null)
                                {
                                    await toCall(packet, client);
                                }
                            }
                            else
                            {
                                var toCall = evt.ToCall as Action <IPacket, SharpStarClient>;

                                if (toCall != null)
                                {
                                    toCall(packet, client);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                SharpStarLogger.DefaultLogger.Error("Plugin {0} has casued an error with packet event {1}!", Name, ((KnownPacket)packet.PacketId).ToString());

                if (ex.InnerException != null)
                {
                    SharpStarLogger.DefaultLogger.Error(ex.InnerException.ToString());
                }

                ex.LogError();
            }
        }
Beispiel #5
0
        public async void SendPacket(SharpStarClient client, IPacket packet)
        {
            if (!Enabled)
            {
                return;
            }

            client.PacketQueue.Enqueue(packet);
            await client.FlushPackets();
        }
        public override async Task Handle(ChatSentPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("chatSent", packet, client);

            string message = packet.Message;

            if (message.StartsWith("/"))
            {
                string[] ex = message.Substring(1).Split(' ');

                string cmd = ex[0];

                string[] args = ex.Skip(1).ToArray();

                if (cmd.Equals("createacct", StringComparison.OrdinalIgnoreCase) && SharpStarMain.Instance.Config.ConfigFile.EnableAccounts)
                {
                    if (client.Server.Player.UserAccount != null)
                    {
                        client.SendChatMessage("Server", "You are already logged into an account!");
                    }
                    else if (args.Length == 2)
                    {
                        string username = args[0];
                        string password = args[1];

                        if (SharpStarMain.Instance.Database.AddUser(username, password))
                        {
                            client.SendChatMessage("Server", "Account created! Please reconnect with your login details.");
                        }
                        else
                        {
                            client.SendChatMessage("Server", "Account already exists!");
                        }
                    }
                    else
                    {
                        client.SendChatMessage("Server", "Syntax: /createacct <username> <password>");
                    }

                    packet.Ignore = true;
                }
                else
                {
                    if (!SharpStarMain.Instance.Config.ConfigFile.AllowedStarboundCommands.Any(p => p.Equals(cmd, StringComparison.OrdinalIgnoreCase)))
                    {
                        if (!await SharpStarMain.Instance.PluginManager.PassChatCommand(client, cmd, args).ConfigureAwait(false))
                        {
                            client.SendChatMessage("Server", "Unknown Command!");
                        }

                        packet.Ignore = true;
                    }
                }
            }
        }
Beispiel #7
0
        public override Task Handle(ConnectionResponsePacket packet, SharpStarClient client)
        {
            if (packet.IsReceive)
            {
                if (client.Server.Player == null)
                {
                    packet.Success         = false;
                    packet.RejectionReason = "An error has occurred!";

                    return(base.Handle(packet, client));
                }

                if (SharpStarMain.Instance.Server.Clients.Count > SharpStarMain.Instance.Config.ConfigFile.MaxPlayers)
                {
                    packet.Success         = false;
                    packet.RejectionReason = SharpStarMain.Instance.Config.ConfigFile.MaxPlayerRejectionReason;

                    client.Server.Player.JoinSuccessful = false;
                }

                if (client.Server.Player.UserAccount == null && SharpStarMain.Instance.Config.ConfigFile.RequireAccountLogin)
                {
                    client.Server.Player.JoinSuccessful = false;

                    packet.Success         = false;
                    packet.RejectionReason = SharpStarMain.Instance.Config.ConfigFile.RequireAccountLoginError;
                }
                else if (client.Server.Player.UserAccount != null)
                {
                    SharpStarMain.Instance.Database.UpdateUserLastLogin(client.Server.Player.UserAccount.Username, DateTime.Now);

                    client.Server.Player.JoinSuccessful = true;
                }
                else if (client.Server.Player.Guest && !client.Server.Player.JoinSuccessful)
                {
                    packet.Success         = false;
                    packet.RejectionReason = SharpStarMain.Instance.Config.ConfigFile.GuestPasswordFailMessage;
                }
                else
                {
                    client.Server.Player.JoinSuccessful = true;
                }

                if (packet.Success && client.Server.Player != null && !string.IsNullOrEmpty(client.Server.Player.Name) && client.Server.Player.JoinSuccessful)
                {
                    SharpStarLogger.DefaultLogger.Info("Player {0} has successfully joined!", client.Server.Player.Name);
                }
            }

            SharpStarMain.Instance.PluginManager.CallEvent("connectionResponse", packet, client);

            return(base.Handle(packet, client));
        }
Beispiel #8
0
        public async void SendPacket(SharpStarClient client, IPacket packet)
        {
            if (!Enabled)
            {
                return;
            }

            if (client != null)
            {
                await client.SendPacket(packet);
            }
        }
Beispiel #9
0
        public override Task Handle(EnvironmentUpdatePacket packet, SharpStarClient client)
        {
            var coords = WorldCoordinate.GetGlobalCoords(packet.Sky);

            if (coords != null)
            {
                client.Server.Player.Coordinates = coords;
            }

            SharpStarMain.Instance.PluginManager.CallEvent("environmentUpdate", packet, client);

            return(base.Handle(packet, client));
        }
Beispiel #10
0
        public async Task <bool> PassChatCommand(SharpStarClient client, string command, string[] args)
        {
            bool anyRegistered = await _csPluginManager.PassChatCommand(client, command, args).ConfigureAwait(false);

            foreach (var plugin in _plugins)
            {
                if (plugin.PassChatCommand(command, client, args))
                {
                    anyRegistered = true;
                }
            }

            return(anyRegistered);
        }
Beispiel #11
0
        public async Task <bool> PassChatCommand(SharpStarClient client, string command, string[] args)
        {
            bool result = false;

            foreach (ICSPlugin plugin in _csPlugins.Values)
            {
                if (await plugin.OnChatCommandReceived(client, command, args).ConfigureAwait(false))
                {
                    result = true;
                }
            }

            return(result);
        }
Beispiel #12
0
        public override async Task Handle(HandshakeChallengePacket packet, SharpStarClient client)
        {
            if (packet.IsReceive)
            {
                packet.Ignore = true;

                if (client.Server.Player.UserAccount != null || !client.Server.Player.AttemptedLogin || client.Server.Player.Guest)
                {
                    string hash = await Task.Run(() => SharpStarSecurity.GenerateHash("", "", packet.Salt, StarboundConstants.Rounds));

                    await client.Server.ServerClient.SendPacket(new HandshakeResponsePacket { PasswordHash = hash });
                }
                else if (client.Server.Player.AttemptedLogin)
                {
                    await client.Server.ServerClient.SendPacket(new HandshakeResponsePacket { PasswordHash = packet.Salt });
                }
            }

            //SharpStarMain.Instance.PluginManager.CallEvent("handshakeChallenge", packet, client);
        }
Beispiel #13
0
        public override Task Handle(EntityCreatePacket packet, SharpStarClient client)
        {
            /*
             * foreach (var ent in packet.Entities)
             * {
             *  if (ent.EntityType == EntityType.Player && ent is PlayerEntity)
             *  {
             *      PlayerEntity pent = (PlayerEntity)ent;
             *
             *      if (pent.UUID == client.Server.Player.UUID)
             *      {
             *          client.Server.Player.EntityId = ent.EntityId;
             *      }
             *  }
             * }
             */

            SharpStarMain.Instance.PluginManager.CallEvent("entityCreate", packet, client);

            return(base.Handle(packet, client));
        }
Beispiel #14
0
        public override Task Handle(HandshakeResponsePacket packet, SharpStarClient client)
        {
            if (packet.IsReceive)
            {
                packet.Ignore = true;

                if (client.Server.Player.UserAccount != null && client.Server.Player.UserAccount.Hash != packet.PasswordHash)
                {
                    client.Server.Player.UserAccount    = null;
                    client.Server.Player.JoinSuccessful = false;
                }
                else if (client.Server.Player.Guest && SharpStarMain.Instance.Config.ConfigFile.GuestPasswordHash != packet.PasswordHash)
                {
                    client.Server.Player.JoinSuccessful = false;
                }
            }

            //SharpStarMain.Instance.PluginManager.CallEvent("handshakeResponse", packet, client);

            return(base.Handle(packet, client));
        }
        public override Task Handle(WarpCommandPacket packet, SharpStarClient client)
        {
            if (packet.WarpType == WarpType.WarpHome)
            {
                client.Server.Player.PlayerShip = null;
                client.Server.Player.OnOwnShip  = true;
            }
            else if (packet.WarpType == WarpType.WarpOtherShip)
            {
                client.Server.Player.PlayerShip = packet.Player;
                client.Server.Player.OnOwnShip  = false;
            }
            else
            {
                client.Server.Player.OnOwnShip = false;
            }

            SharpStarMain.Instance.PluginManager.CallEvent("warpCommand", packet, client);

            return(base.Handle(packet, client));
        }
Beispiel #16
0
        public override Task Handle(TileArrayUpdatePacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("tileArrayUpdate", packet, client);

            return(base.Handle(packet, client));
        }
Beispiel #17
0
        public override Task Handle(StopCraftingInContainerPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("stopCraftingInContainerResult", packet, client);

            return(base.Handle(packet, client));
        }
        public override Task HandleAfter(TileLiquidUpdatePacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("afterTileLiquidUpdateResult", packet, client);

            return(base.HandleAfter(packet, client));
        }
Beispiel #19
0
 public virtual Task HandleAfter(T packet, SharpStarClient client)
 {
     return(Task.FromResult(false));
 }
Beispiel #20
0
        public override Task Handle(EntityInteractPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("entityInteractResult", packet, client);

            return(base.Handle(packet, client));
        }
        public override Task HandleAfter(SpawnEntityPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("afterSpawnEntity", packet, client);

            return(base.HandleAfter(packet, client));
        }
        public override Task HandleAfter(ItemApplyInContainerPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("afterItemApplyInContainerResult", packet, client);

            return(base.HandleAfter(packet, client));
        }
Beispiel #23
0
        public override Task Handle(DamageRequestPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("damageRequestResult", packet, client);

            return(base.Handle(packet, client));
        }
        /*
         * public override async Task Handle(ClientConnectPacket packet, SharpStarClient client)
         * {
         *
         *   if (packet.IsReceive)
         *   {
         *       string uuid = BitConverter.ToString(packet.UUID, 0).Replace("-", String.Empty).ToLower();
         *
         *       var clients = SharpStarMain.Instance.Server.Clients.Where(p => p.Player != null && p.Player.UUID == uuid);
         *       clients.ToList().ForEach(p =>
         *       {
         *           SharpStarLogger.DefaultLogger.Info("Duplicate UUID ({0}) detected. Killing old client!", uuid);
         *           p.PlayerClient.ForceDisconnect();
         *           p.ServerClient.ForceDisconnect();
         *       });
         *
         *       client.Server.Player = new StarboundPlayer(packet.PlayerName.StripColors(), uuid)
         *       {
         *           NameWithColor = packet.PlayerName,
         *           Species = packet.Species,
         *           OnOwnShip = true
         *       };
         *
         *       if (!string.IsNullOrEmpty(packet.Account.Trim()))
         *       {
         *           client.Server.Player.Guest = false;
         *           client.Server.Player.AttemptedLogin = true;
         *
         *           SharpStarUser user = SharpStarMain.Instance.Database.GetUser(packet.Account.Trim());
         *
         *           if (user == null)
         *           {
         *               await client.Server.PlayerClient.SendPacket(new HandshakeChallengePacket { Salt = "" });
         *
         *               return;
         *           }
         *
         *           packet.Account = "";
         *
         *           client.Server.Player.UserAccount = user;
         *           client.Server.Player.JoinSuccessful = true;
         *
         *           await client.Server.PlayerClient.SendPacket(new HandshakeChallengePacket { Salt = user.Salt });
         *       }
         *       else if (string.IsNullOrEmpty(packet.Account.Trim()) && !string.IsNullOrEmpty(SharpStarMain.Instance.Config.ConfigFile.GuestPassword))
         *       {
         *           client.Server.Player.AttemptedLogin = true;
         *           client.Server.Player.Guest = true;
         *
         *           if (string.IsNullOrEmpty(SharpStarMain.Instance.Config.ConfigFile.GuestPasswordSalt) || string.IsNullOrEmpty(SharpStarMain.Instance.Config.ConfigFile.GuestPasswordHash))
         *           {
         *               string salt = SharpStarSecurity.GenerateSalt();
         *               string hash = SharpStarSecurity.GenerateHash("", SharpStarMain.Instance.Config.ConfigFile.GuestPassword, salt, StarboundConstants.Rounds);
         *
         *               SharpStarMain.Instance.Config.ConfigFile.GuestPasswordSalt = salt;
         *               SharpStarMain.Instance.Config.ConfigFile.GuestPasswordHash = hash;
         *               SharpStarMain.Instance.Config.Save(SharpStarMain.ConfigFile);
         *           }
         *
         *           client.Server.Player.JoinSuccessful = true;
         *
         *           await client.Server.PlayerClient.SendPacket(new HandshakeChallengePacket { Salt = SharpStarMain.Instance.Config.ConfigFile.GuestPasswordSalt });
         *       }
         *   }
         *
         *   SharpStarMain.Instance.PluginManager.CallEvent("clientConnected", packet, client);
         * }
         */

        public override Task Handle(ClientConnectPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("clientDisconnected", packet, client);

            return(base.Handle(packet, client));
        }
Beispiel #25
0
 public static bool IsAdmin(this SharpStarClient client)
 {
     return(client.Server.Player.UserAccount != null && client.Server.Player.UserAccount.IsAdmin);
 }
Beispiel #26
0
        public override Task HandleAfter(WorldStopPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("afterWorldStop", packet, client);

            return(base.HandleAfter(packet, client));
        }
Beispiel #27
0
        public override Task HandleAfter(ProtocolVersionPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("afterProtocolVersion", packet, client);

            return(base.HandleAfter(packet, client));
        }
        public override Task HandleAfter(UpdateTileProtectionPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("afterUpdateTileProtectionResult", packet, client);

            return(base.HandleAfter(packet, client));
        }
Beispiel #29
0
        public override Task HandleAfter(DamageNotificationPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("afterDamageNotification", packet, client);

            return(base.HandleAfter(packet, client));
        }
        /*
         * public override Task Handle(WorldStartPacket packet, SharpStarClient client)
         * {
         *
         *  Variant planet = packet.Planet;
         *  VariantDict planetDict = (VariantDict) planet.Value;
         *
         *  if (planetDict.ContainsKey("celestialParameters"))
         *  {
         *      var celestParamsDict = (VariantDict) planetDict["celestialParameters"].Value;
         *
         *      if (celestParamsDict != null)
         *      {
         *          var coordinateDict = (VariantDict) celestParamsDict["coordinate"].Value;
         *
         *          if (coordinateDict != null)
         *          {
         *              var loc = (Variant[]) coordinateDict["location"].Value;
         *
         *              var pCoords = new PlanetCoordinate
         *              {
         *                  Sector = (string) coordinateDict["sector"].Value,
         *                  X = (ulong) loc[0].Value,
         *                  Y = (ulong) loc[1].Value,
         *                  Z = (ulong) loc[2].Value,
         *                  Planet = (ulong) coordinateDict["planet"].Value,
         *                  Satellite = (ulong) coordinateDict["satellite"].Value
         *              };
         *
         *              client.Server.Player.OnShip = false;
         *          }
         *      }
         *      else
         *      {
         *          client.Server.Player.OnShip = true;
         *      }
         *  }
         *
         *  var coords = WorldCoordinate.GetGlobalCoords(packet.Sky);
         *
         *  if (coords != null)
         *  {
         *      client.Server.Player.Coordinates = coords;
         *  }
         *
         *  client.Server.Player.ClientId = packet.ClientId;
         *  client.Server.Player.SpawnX = packet.SpawnX;
         *  client.Server.Player.SpawnY = packet.SpawnY;
         *
         *  SharpStarMain.Instance.PluginManager.CallEvent("worldStart", packet, client);
         *
         *  return base.Handle(packet, client);
         * }
         *
         * public override Task HandleAfter(WorldStartPacket packet, SharpStarClient client)
         * {
         *  SharpStarMain.Instance.PluginManager.CallEvent("afterWorldStart", packet, client);
         *
         *  return base.HandleAfter(packet, client);
         * }
         */

        public override Task Handle(WorldStartPacket packet, SharpStarClient client)
        {
            SharpStarMain.Instance.PluginManager.CallEvent("chatSendResult", packet, client);

            return(base.Handle(packet, client));
        }