Exemple #1
0
 protected override void OnStart(string[] args)
 {
     _workerCount = CommonConvert.Obj2Int(ConfigurationManager.AppSettings["WorkerCount"]);
     for (var i = 0; i < _workerCount; i++)
     {
         var workerTask = new Task(() =>
         {
             WorkerLog wk = new WorkerLog();
             wk.StartConsume();
             Console.ReadLine();
         });
         workerTask.Start();
     }
 }
Exemple #2
0
 private void WorkerLog(string text)
 {
     if (textBox1.InvokeRequired)
     {
         var      d       = new WorkerLog(WorkerLog);
         object[] objects = { text };
         Invoke(d, objects);
     }
     else
     {
         textBox1.AppendText(DateTime.Now.ToString(CultureInfo.InvariantCulture));
         textBox1.AppendText("\t");
         textBox1.AppendText(text);
         textBox1.AppendText(Environment.NewLine);
     }
 }
Exemple #3
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;
            }
        }