Пример #1
0
        public static async Task RestoreTempbanRoles(ulong id)
        {
            var user = await Global.GetSwissbotUser(id);

            if (user == null)
            {
                return;
            }

            var tmban = TempBans.FirstOrDefault(x => x.UserId == id);

            if (tmban == null)
            {
                return;
            }

            await SwissbotWorkerHandler.AssignTasks(WorkerTask.AddRoles, "add", tmban.PreviousRoles, user.Id);

            WorkerTaskCreator.CreateTask(WorkerTask.RemoveRoles, user.Id, "remove", 783462878976016385);
            WorkerTaskCreator.CreateTask(WorkerTask.RemoveRoles, user.Id, "remove", 627683033151176744);
        }
Пример #2
0
        public static async Task <ulong[]> ClearAndAddTempbanRoles(ulong id)
        {
            var user = await Global.GetSwissbotUser(id);

            if (user == null)
            {
                return(null);
            }

            ulong[] roles = null;

            RoleRevokes.Add(id, false);

            while (RoleRevokes.Any(x => x.Key == id && !x.Value))
            {
                user = await Global.GetSwissbotUser(id);

                roles = user.RoleIds.Where(x => x != Global.SwissGuildId && x != 627683033151176744 && x != 783462878976016385).ToArray();

                await SwissbotWorkerHandler.AssignTasks(WorkerTask.RemoveRoles, "remove", roles.Select(x => x).ToArray(), user.Id);

                if (!user.RoleIds.Any(x => x == 783462878976016385))
                {
                    WorkerTaskCreator.CreateTask(WorkerTask.AddRoles, user.Id, "add", 783462878976016385);
                }
                if (!user.RoleIds.Any(x => x == 627683033151176744))
                {
                    WorkerTaskCreator.CreateTask(WorkerTask.AddRoles, user.Id, "add", 627683033151176744);
                }

                await Task.Delay(1000);
            }

            RoleRevokes.Remove(id);

            return(roles);
        }
Пример #3
0
        private static async void HandleDequeue()
        {
            while (_queue.TryDequeue(out var item))
            {
                CurrentWorker++;

                if (CurrentWorker == Global.Workers.Length)
                {
                    CurrentWorker = -1;
                }

                if (CurrentWorker == -1)
                {
                    var user = await Global.GetSwissbotUser(item.UserId);

                    if (user == null)
                    {
                        continue;
                    }

                    switch (item.Task)
                    {
                    case WorkerTask.Deafen:
                        await user.ModifyAsync(x => x.Deaf = item.Value);

                        break;

                    case WorkerTask.Mute:
                        await user.ModifyAsync(x => x.Mute = item.Value);

                        break;

                    case WorkerTask.AddRoles:
                        List <IRole> roles = new List <IRole>();
                        foreach (var r in item.Roles)
                        {
                            roles.Add(user.Guild.GetRole(r));
                        }
                        await user.AddRolesAsync(roles);

                        break;

                    case WorkerTask.RemoveRoles:
                        List <IRole> rs = new List <IRole>();
                        foreach (var r in item.Roles)
                        {
                            rs.Add(user.Guild.GetRole(r));
                        }
                        await user.RemoveRolesAsync(rs);

                        break;
                    }
                }
                else
                {
                    if (item.Task == WorkerTask.RemoveRoles || item.Task == WorkerTask.AddRoles)
                    {
                        await SwissbotWorkerHandler.AssignTask(item.Task, item.Task == WorkerTask.AddRoles? "add" : "remove", item.Roles, CurrentWorker, item.UserId);
                    }
                    else
                    {
                        await SwissbotWorkerHandler.AssignTask(item.Task, item.Value, CurrentWorker, item.UserId);
                    }
                }
            }
        }
Пример #4
0
        private static async void WebSocketServer_MessageReceived(object sender, WebSocketReceiveEventArgs e)
        {
            if (e.result.MessageType == WebSocketMessageType.Close)
            {
                Global.ConsoleLog($"Got a close, Updating session", ConsoleColor.Cyan, ConsoleColor.Black);

                var user = CurrentClients.FirstOrDefault(x => x.Socket.Equals(e.socket));

                if (user == null)
                {
                    return;
                }

                user.SetDisconnected();
                return;
            }

            // Deserialize the data
            string content = Encoding.UTF8.GetString(e.data);

            IWebsocketMessage message;

            try
            {
                message = JsonConvert.DeserializeObject <WebsocketMessage>(content);
            }
            catch (Exception x)
            {
                Global.ConsoleLog("Closing client with bad message type", ConsoleColor.Cyan, ConsoleColor.Black);
                // Close the socket
                CurrentClients.RemoveAll(x => x.Socket.Equals(e.socket));
                await e.socket.CloseAsync(WebSocketCloseStatus.InvalidMessageType, "Bad Handshake", CancellationToken.None);

                return;
            }

            switch (message.type)
            {
            case "handshake":
                Global.ConsoleLog("Got new handshake", ConsoleColor.Cyan, ConsoleColor.Black);

                // Parse the handshake
                Handshake hs = Handshake.fromContent(content);

                if (hs.workerId != -1)
                {
                    if (SwissbotWorkerHandler.isValidHandshake(hs))
                    {
                        SwissbotWorkerHandler.AcceptHandshake(hs, e.socket);
                        await e.socket.SendAsync(Encoding.UTF8.GetBytes("{\"type\": \"handshake_accept\"}"), WebSocketMessageType.Text, true, CancellationToken.None);

                        return;
                    }
                    else
                    {
                        // Bad handshake
                        await e.socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Invalid session", CancellationToken.None);

                        return;
                    }
                }
                else
                {
                    // Check if the user has a valid session
                    var u = DiscordAuthKeeper.GetUser(hs.session);
                    if (u == null)
                    {
                        Global.ConsoleLog($"No session was provided for new websocket user,\nsession: {hs.session}\npacket: {content}", ConsoleColor.Yellow);
                        await e.socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Invalid session", CancellationToken.None);

                        return;
                    }

                    // Check if they have permission for the requested events
                    if (!EventPermissions.hasPermissionForEvent(u, hs.events))
                    {
                        Global.ConsoleLog("Invalid permissions for websocket user", ConsoleColor.Yellow);

                        byte[] returnData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new
                        {
                            status = $"Invalid Permissions for the requested event(s): {string.Join(", ", hs.events)}",
                            type   = "handshake_deny"
                        }));

                        await e.socket.SendAsync(returnData, WebSocketMessageType.Text, true, CancellationToken.None);

                        return;
                    }

                    // Check if this is a resumed session
                    if (CanResumeSession(hs))
                    {
                        // Resume the session
                        var session = GetResumedSession(hs);
                        session.ResumeSession(hs, e.socket);
                        Global.ConsoleLog($"Resumed {session.User.Username}'s session", ConsoleColor.Cyan, ConsoleColor.Black);
                    }
                    else
                    {
                        Global.ConsoleLog("Creating new WebsocketUser", ConsoleColor.Cyan, ConsoleColor.Black);
                        // Add the client
                        CurrentClients.Add(new WebsocketUser(hs, e.socket));
                    }

                    // Send an OK status
                    byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new
                    {
                        status = "OK",
                        type   = "handshake_accept"
                    }));

                    await e.socket.SendAsync(data, WebSocketMessageType.Text, true, CancellationToken.None);
                }

                break;

            case "Log":
                WorkerLog log = JsonConvert.DeserializeObject <WorkerLog>(content);
                SwissbotWorkerHandler.WorkerLog(log.message);

                break;

            default:
                if (customEvent.ContainsKey(message.type))
                {
                    if (EventPermissions.hasPermissionForEvent(message.session.Replace("csSessionID=", ""), message.type))
                    {
                        var task = customEvent[message.type];
                        await Task.Run(() => task.Invoke(new RawWebsocketMessage(message, content, e.socket)).ConfigureAwait(false));
                    }
                }
                break;
            }
        }