private void OnPlayerConnecting([FromSource] Player player, string name, CallbackDelegate kickReason, ExpandoObject deferrals) { try { DebugLog($"Connecting: {player.Name} {player.Identifiers["steam"]}"); // Check if in queue DebugLog($"Currently in queue: {string.Join(", ", _queue.Select(q => q.SteamId))}"); QueuePlayer queuePlayer = _queue.FirstOrDefault(p => p.SteamId == player.Identifiers["steam"]); if (queuePlayer != null) { // Player had a slot in the queue, give them it back. DebugLog($"Player found in queue: {queuePlayer.Name}"); queuePlayer.Handle = int.Parse(player.Handle); queuePlayer.Status = QueueStatus.Queued; queuePlayer.ConnectTime = new DateTime(); queuePlayer.JoinCount++; queuePlayer.Deferrals = deferrals; ((CallbackDelegate)queuePlayer.Deferrals.ToList()[0].Value)(); ((CallbackDelegate)queuePlayer.Deferrals.ToList()[2].Value)("Connecting"); return; } // Slot available, don't bother with the queue. if (this.Players.Count() < _config.MaxClients && !_config.QueueWhenNotFull) { return; } // Check if the player is in the priority list PriorityPlayer priorityPlayer = _config.PriorityPlayers.FirstOrDefault(p => p.SteamId == player.Identifiers["steam"]); // Add to queue queuePlayer = new QueuePlayer() { Handle = int.Parse(player.Handle), SteamId = player.Identifiers["steam"], Name = player.Name, JoinCount = 1, JoinTime = DateTime.UtcNow, Deferrals = deferrals, Priority = priorityPlayer?.Priority ?? 100 }; AddToQueue(queuePlayer); } catch (Exception e) { Log(e.Message); API.CancelEvent(); } }
private void OnRconCommand(string command, List <object> objargs) { if (command.ToLowerInvariant() != "queue") { return; } Function.Call(Hash.CANCEL_EVENT); List <string> args = objargs.Cast <string>().ToList(); if (args.Count == 0) { args.Add("help"); } switch (args.First().ToLowerInvariant()) { case "reload": string initServerName = _config.ServerName; _config = Config.Load(_configPath); _config.ServerName = initServerName; break; case "clear": foreach (QueuePlayer playerToClear in _queue) { ((CallbackDelegate)playerToClear.Deferrals?.ToList()[1].Value)?.Invoke("Queue reset"); } _queue.Clear(); Log("Queue cleared!"); break; case "add": if (args.Count < 2) { Log("Please pass a steam ID to add to the queue"); return; } // Check if the player is in the priority list PriorityPlayer priorityPlayer = _config.PriorityPlayers.FirstOrDefault(p => p.SteamId == args[1]); // Add to queue AddToQueue(new QueuePlayer { SteamId = args[1], Name = $"Manual Player - {args[1]}", JoinCount = 1, JoinTime = DateTime.UtcNow, DisconnectTime = DateTime.UtcNow, Status = QueueStatus.Disconnected, Priority = priorityPlayer?.Priority ?? 100 } ); break; case "remove": if (args.Count < 2) { Log("Please pass a steam ID to remove from the queue"); return; } QueuePlayer playerToRemove = _queue.FirstOrDefault(p => p.SteamId == args[1]); if (playerToRemove == null) { Log("Player not found in queue"); return; } ((CallbackDelegate)playerToRemove.Deferrals?.ToList()[1].Value)?.Invoke("Force removed from queue."); _queue.Remove(playerToRemove); Log($"Player {playerToRemove.Name} ({playerToRemove.SteamId}) removed from queue"); break; case "status": Log("Queue:"); foreach (QueuePlayer queuePlayer in _queue) { Log($"{_queue.IndexOf(queuePlayer) + 1}: " + $"{queuePlayer.Name} - {queuePlayer.SteamId} " + $"[Priority: {queuePlayer.Priority}] " + $"[Status: {Enum.GetName(typeof(QueueStatus), queuePlayer.Status)}] " + $"[Joined: {queuePlayer.JoinTime.ToLocalTime()}]"); } break; case "move": if (args.Count < 2) { Log("Please pass a steam ID to move"); return; } QueuePlayer playerToMove = _queue.FirstOrDefault(p => p.SteamId == args[1]); if (playerToMove == null) { Log("Player not found in queue"); return; } if (args.Count < 3) { args.Add("1"); // Default to first in queue } _queue.Remove(playerToMove); _queue.Insert(int.Parse(args[2]) - 1, playerToMove); Log($"Moved player {playerToMove.Name} ({playerToMove.SteamId}) to position {args[2]}"); break; case "help": Log("IgiCore - Queue: Help" + Environment.NewLine + " reload: Reload the queue config file" + Environment.NewLine + " clear: Force remove all currently queued players" + Environment.NewLine + " add <steamid>: Manually insert a steamid into the queue (useful for debugging purposes)" + Environment.NewLine + " remove <steamid>: Remove a specific steamid from the queue" + Environment.NewLine + "move <steamid> [position]: Move a specific steamid to a position in the queue (defaults to 1st in queue if not passed a position)" + Environment.NewLine + " status: Display the current list of players in the queue" ); break; default: Log("No such command exists, please type 'queue help' for help."); break; } }
private void OnRconCommand(string command, List <object> objargs) { if (command.ToLowerInvariant() != "queue") { return; } List <string> args = objargs.Cast <string>().ToList(); switch (args[0].ToLowerInvariant()) { case "reload": string initServerName = _config.ServerName; _config = Config.Load(_configPath); _config.ServerName = initServerName; break; case "clear": foreach (QueuePlayer playerToClear in _queue) { ((CallbackDelegate)playerToClear.Deferrals?.ToList()[1].Value)?.Invoke("Queue reset"); } _queue.Clear(); Log("Queue cleared!"); break; case "add": if (args.Count < 2) { Log("Please pass a steam ID to add to the queue"); return; } // Check if the player is in the priority list PriorityPlayer priorityPlayer = _config.PriorityPlayers.FirstOrDefault(p => p.SteamId == args[1]); // Add to queue AddToQueue(new QueuePlayer { SteamId = args[1], Name = $"Manual Player - {args[1]}", ConnectCount = 1, ConnectTime = DateTime.UtcNow, DisconnectTime = DateTime.UtcNow, Status = QueueStatus.Disconnected, Priority = priorityPlayer?.Priority ?? 100 } ); break; case "remove": if (args.Count < 2) { Log("Please pass a steam ID to remove from the queue"); return; } QueuePlayer playerToRemove = _queue.FirstOrDefault(p => p.SteamId == args[1]); if (playerToRemove == null) { Log("Player not found in queue"); return; } ((CallbackDelegate)playerToRemove.Deferrals?.ToList()[1].Value)?.Invoke("Force removed from queue."); _queue.Remove(playerToRemove); Log($"Player {playerToRemove.Name} ({playerToRemove.SteamId}) removed from queue"); break; case "status": Log("Queue:"); foreach (QueuePlayer queuePlayer in _queue) { Log($"{_queue.IndexOf(queuePlayer) + 1}: " + $"{queuePlayer.Name} - {queuePlayer.SteamId} " + $"[Priority: {queuePlayer.Priority}] " + $"[Status: {Enum.GetName(typeof(QueueStatus), queuePlayer.Status)}] " + $"[Connected: {queuePlayer.ConnectTime.ToLocalTime()}]"); } break; case "move": if (args.Count < 2) { Log("Please pass a steam ID to move"); return; } QueuePlayer playerToMove = _queue.FirstOrDefault(p => p.SteamId == args[1]); if (playerToMove == null) { Log("Player not found in queue"); return; } if (args.Count < 3) { args.Add("1"); // Default to first in queue } _queue.Remove(playerToMove); _queue.Insert(int.Parse(args[2]) - 1, playerToMove); Log($"Moved player {playerToMove.Name} ({playerToMove.SteamId}) to position {args[2]}"); break; default: Log("No such command exists"); break; } Function.Call(Hash.CANCEL_EVENT); }