public async Task <bool> DoKick(KickingEventArgs ev)
        {
            string banned_user_id = ev.Target.UserId;
            Player adminHub       = ev.Issuer;
            string adminId        = "idk";

            Log.Info("Kick DETECTED:");
            Log.Info($"Banned ID: {banned_user_id}");
            Log.Info($"Admin Name: {adminHub.Nickname}");
            Log.Info($"Admin ID: {adminId}");

            if (await WebTask.IssueKick(plugin.Config.APIKey, banned_user_id, ev.Target.Nickname, adminId, ev.Reason))
            {
                Log.Info($"Successfully pushed kick for {banned_user_id} to the web API!");
                SendClientToServer(ev.Target, 7796);
                // We can safely remove the ban since the web client will handle it from here.
                //BanHandler.RemoveBan(ev.Details.Id, ev.Type);
                return(true);
            }
            else
            {
                // Error out to requesting admin
                adminHub.Broadcast(15, $"ERROR while adding kick to web API for: {ev.Target.Nickname}({banned_user_id})");
                Log.Error($"FATAL KICKING ERROR! WebTask.IssueKick() Failed to push to web API");
                ServerConsole.Disconnect(ev.Target.GameObject.gameObject, ev.Reason);

                return(false);
            }
        }
        public async Task <bool> DoBan(BanningEventArgs ev)
        {
            string banned_user_id    = ev.Target.UserId;
            string banned_nickname   = ev.Target.Nickname;
            string banned_ip_address = ev.Target.IPAddress;
            int    banduration       = ev.Duration;
            Player adminHub          = ev.Issuer;

            Log.Info("--------------------------------------");
            Log.Info("Ban detected, plugin taking over:");
            Log.Info($"Banned Name: {banned_nickname}");
            Log.Info($"Banned ID: {banned_user_id}");
            Log.Info($"Banned IP: {banned_ip_address}");
            Log.Info($"Admin Name: {adminHub.Nickname}");
            Log.Info($"Admin ID: {adminHub.UserId}");
            Log.Info($"Duration: {banduration}");
            if (banduration.ToString().Contains("1576800000"))
            {
                banduration = 0;
                Log.Info($"Duration: UPDATED TO PERM!");
            }
            string reason = ev.Reason;

            if (reason == "")
            {
                reason = "No reason provided. Please contact a Head Administrator for further details.";
            }
            if (await WebTask.IssueBan(plugin.Config.APIKey, banned_user_id, banned_nickname, banned_ip_address, adminHub.UserId, banduration, reason, ev.Target.ReferenceHub.serverRoles.DoNotTrack))
            {
                Log.Info($"Successfully pushed ban for {banned_user_id} ({banned_ip_address}) to the web API!");
                Log.Info("--------------------------------------");
                SendClientToServer(ev.Target, 7790);
                // We can safely remove the ban since the web client will handle it from here.
                //BanHandler.RemoveBan(ev.Target.UserId, ev.);
                return(true);
            }
            else
            {
                // Error out to requesting admin
                adminHub.Broadcast(15, $"ERROR while adding ban to web API for: {banned_nickname}({banned_user_id})");
                Log.Error($"FATAL BANNING ERROR! WebTask.IssueBan() Failed to push to web API");


                // Actually ban them since the webapi decided to do the funny...
                BanDetails ban = new BanDetails
                {
                    OriginalName = ev.Target.Nickname,
                    Id           = ev.Target.UserId,
                    IssuanceTime = TimeBehaviour.CurrentTimestamp(),
                    Expires      = DateTime.UtcNow.AddMinutes((double)ev.Duration).Ticks,
                    Reason       = ev.Reason,
                    Issuer       = ev.Issuer.UserId
                };
                BanHandler.IssueBan(ban, BanHandler.BanType.UserId);
                Log.Info("Pushed manual server-side ban.");
                Log.Info("--------------------------------------");
                return(false);
            }
            return(false);
        }
        public async Task DisconnectChecks(LeftEventArgs ev)
        {
            PlayerInfo pinfo;

            if (PlayerInfoDict.TryGetValue(ev.Player.UserId, out pinfo))
            {
                long sessionTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() - pinfo.connectTime;
                Log.Info($"[Player Update] Logging Playerdata for {ev.Player} ({ev.Player.UserId})[{ev.Player.IPAddress}] Session Time: {sessionTime} DNT: {ev.Player.ReferenceHub.serverRoles.DoNotTrack}");
                await WebTask.UpdatePlayer(plugin.Config.APIKey, plugin.Config.ServerSlug, ev.Player.UserId, ev.Player.IPAddress, ev.Player.Nickname, ev.Player.ReferenceHub.serverRoles.DoNotTrack, sessionTime);
            }

            if (PlayerInfoDict.ContainsKey(ev.Player.UserId))
            {
                PlayerInfoDict.Remove(ev.Player.UserId);
            }
        }
        public async Task BanChecks(PreAuthenticatingEventArgs ev)
        {
            Log.Info($" USERID: {ev.UserId} connected, pulling player info from web api!");
            if (plugin.Config.IsLobby)
            {
                await WebTask.IsKickedDetail(plugin.Config.APIKey, ev.UserId);

                await WebTask.IsBannedDetail(plugin.Config.APIKey, ev.UserId, false);
            }
            else
            {
                if (await WebTask.GetPlayerInfo(plugin.Config.APIKey, ev.UserId))
                {
                    PlayerInfo pi;
                    if (PlayerInfoDict.TryGetValue(ev.UserId, out pi))
                    {
                        ;
                    }
                    {
                        if (pi.isBanned)
                        {
                            Player ply = Player.Get(ev.UserId);
                            if (ply != null)
                            {
                                SendClientToServer(ply, 7790);
                            }
                            else
                            {
                                StartStopwatch();
                                ToKick.Add(new PlayerToKick(ev.UserId, KickReason.Ban));
                            }
                            return;
                        }
                    }
                }
            }
        }
        public static async Task <bool> DoUploadLogs()
        {
            await WebTask.UploadRoundLogs(logList);

            return(true);
        }
        /******************************************************************************
        *                                  ASYNC EVENT HANDLING
        ******************************************************************************/

        public async Task ConnectChecks(JoinedEventArgs ev)
        {
            if (ToKick.TryGetValue(new PlayerToKick(ev.Player.UserId, KickReason.Ban),
                                   out var tk))
            {
                ToKick.Remove(tk);
                SendClientToServer(ev.Player, 7790);
            }

            PlayerInfo pinfo;

            if (PlayerInfoDict.TryGetValue(ev.Player.UserId, out pinfo))
            {
                if (pinfo.needsCreating)
                {
                    await WebTask.CreatePlayer(plugin.Config.APIKey, ev.Player.UserId, ev.Player.Nickname, ev.Player.ReferenceHub.serverRoles.DoNotTrack);

                    return;
                }
                if (pinfo.isStaff)
                {
                    UserGroup ug = ServerStatic.GetPermissionsHandler().GetGroup(pinfo.adminRank);
                    ev.Player.SetRank(pinfo.adminRank, ug);
                    string badgetext = ug.BadgeText;
                    switch (pinfo.adminRank)
                    {
                    case "owner":
                    {
                        pinfo.badgeText = "OWNER";
                        break;
                    }

                    case "doa":
                    {
                        pinfo.badgeText = "O5-COUNCIL (DIRECTOR)";
                        break;
                    }

                    case "management":
                    {
                        pinfo.badgeText = "SERVER MANAGER";
                        break;
                    }

                    case "headadmin":
                    {
                        pinfo.badgeText = "COMMANDER (HEAD-ADMIN)";
                        break;
                    }

                    case "admin":
                    {
                        pinfo.badgeText = "LIEUTENANT (ADMIN)";
                        break;
                    }

                    case "moderator":
                    {
                        pinfo.badgeText = "CADET (MOD)";
                        break;
                    }

                    case "juniormod":
                    {
                        pinfo.badgeText = "FACILITY GUARD (JR.MOD)";
                        break;
                    }
                    }
                    ev.Player.RankName = badgetext;
                }
                if (pinfo.isTop20)
                {
                    UserGroup rank = ev.Player.Group;

                    if (rank == null)
                    {
                        ev.Player.RankName  = "TOP 20 PLAYTIME";
                        ev.Player.RankColor = "lime";
                    }
                    else
                    {
                        pinfo.badgeColor = rank.BadgeColor;
                        Log.Info($"[TOP 20] {ev.Player.Nickname} ({ev.Player.UserId}) Is Top20, and is alternating badges. {rank.BadgeText} {rank.BadgeColor}");
                    }
                }
                PlayerInfoDict.Remove(ev.Player.UserId);                 // Remove old shit
                PlayerInfoDict.Add(ev.Player.UserId, pinfo);             // Add it back
            }

            if (!plugin.Config.IsLobby)
            {
                Timing.RunCoroutine(MOTD(ev.Player));
            }
            return;
        }