コード例 #1
0
        void HandleClient(object obj)
        {
            Socket client = obj as Socket;

            while (IsServerWork)
            {
                try
                {
                    byte[] buffer = new byte[6500];
                    client.Receive(buffer); // Принимаем данные

                    Guid id = Guid.NewGuid();

                    ActAbstract command = commandParser.ParseCommand(buffer, client);

                    if (sender.ExistUser(client))
                    {
                        NewRequest?.Invoke(DateTime.Now, command.ToString().Split('.').Last(), id, sender.GetUserID(client));                          // Событие нового сообщения
                    }
                    else
                    {
                        NewRequest?.Invoke(DateTime.Now, command.ToString().Split('.').Last(), id, Guid.Empty);  // Событие нового сообщения
                    }
                    command.Execute();
                    NewResponse?.Invoke(DateTime.Now, id);
                }
                catch (SocketException)
                {
                    break; // Выходим из цикла
                }
            }

            // Заканчиваем подключение
            sender.RemoveUser(client);
            CliendDisconnect.Invoke();
            client.Shutdown(SocketShutdown.Both);
            client.Disconnect(false);
            client.Dispose();
        }
コード例 #2
0
        private async void OnMessageReceived(object sender, MessageEventArgs messageEventArgs)
        {
            var message = messageEventArgs.Message;

            if (message == null)
            {
                Logger.Warn("Received null");
                return;
            }

            Logger.Debug($"Received message from @{message.From.Username}: {message.Text}");

            try
            {
                if (message.Type == MessageType.Text && message.Text.StartsWith('/'))
                {
                    // is a command
                    switch (message.Text.Split(' ').First())
                    {
                    case "/start":
                    case "/help":
                        await _bot.SendTextMessageAsync(message.Chat,
                                                        $"Welcome!\nDrop a URL, get a PNG + PDF.\nDemo development bot, service not guaranteed.\nSet up yours at https://github.com/Jamesits/ScreenShooter \n\n{Globals.ProgramIdentifier}",
                                                        replyToMessageId : message.MessageId);

                        break;

                    case "/UserInfo":
                        if (!Administrators.Contains(message.Chat.Id))
                        {
                            goto default;
                        }
                        await _bot.SendTextMessageAsync(message.Chat, $"User ID: {message.Chat.Id}",
                                                        replyToMessageId : message.MessageId);

                        break;

                    case "/DiagnosticInfo":
                        if (!Administrators.Contains(message.Chat.Id))
                        {
                            goto default;
                        }
                        await _bot.SendTextMessageAsync(message.Chat, RuntimeInformation.ToString(),
                                                        replyToMessageId : message.MessageId);

                        break;

                    case "/ForceGarbageCollection":
                        if (!Administrators.Contains(message.Chat.Id))
                        {
                            goto default;
                        }
                        var sb = new StringBuilder();
                        sb.AppendLine($"Before GC: {RuntimeInformation.WorkingSet}Bytes");
                        GC.Collect(2, GCCollectionMode.Optimized, true, true);
                        sb.AppendLine($"After GC: {RuntimeInformation.WorkingSet}Bytes");
                        await _bot.SendTextMessageAsync(message.Chat, sb.ToString(),
                                                        replyToMessageId : message.MessageId);

                        break;

                    default:
                        await _bot.SendTextMessageAsync(message.Chat, "Unknown command. \n\n/help - get help",
                                                        replyToMessageId : message.MessageId);

                        break;
                    }
                }
                else
                {
                    // get text from message
                    var content = "";
                    switch (message.Type)
                    {
                    case MessageType.Text:
                        content = message.Text;
                        break;

                    case MessageType.Photo:
                    case MessageType.Video:
                    case MessageType.Audio:
                    case MessageType.Document:
                        content = message.Caption;
                        break;

                    default:
                        content = null;
                        break;
                    }

                    if (content == null)
                    {
                        Logger.Debug($"Received unknown message from @{message.From.Username} type {message.Type}");
                        await _bot.SendTextMessageAsync(message.Chat, "Unacceptable content",
                                                        replyToMessageId : message.MessageId);

                        return;
                    }

                    // check if there is any valid url

                    var result = Url.ExtractValidUrls(content).ToList();

                    // also try if we can extract URLs from entities
                    if (message.Entities != null)
                    {
                        foreach (var e in message.Entities)
                        {
                            switch (e.Type)
                            {
                            case MessageEntityType.Url:
                                Logger.Debug($"Entity type URL: {e.Url}");
                                if (Url.IsValidUrl(e.Url))
                                {
                                    result.Add(e.Url.Trim());
                                }
                                break;

                            case MessageEntityType.TextLink:
                                // This is equal to <a> tag in HTML
                                Logger.Debug($"Entity type TextURL: {e.Url}");
                                if (Url.IsValidUrl(e.Url))
                                {
                                    result.Add(e.Url.Trim());
                                }
                                break;
                            }
                        }
                    }

                    // remove duplication
                    result = result.Distinct().ToList();

                    // TODO: if returned multiple URLs?

                    if (result.Count > 0)
                    {
                        // is a valid URL
                        await _bot.SendTextMessageAsync(message.Chat,
                                                        $"Job enqueued. Sit back and relax - this is going to take minutes. \nRunning: {RuntimeInformation.OnGoingRequests}\nWaiting: {RuntimeInformation.QueuedRequests}\nMax parallel jobs: {Globals.GlobalConfig.ParallelJobs}",
                                                        replyToMessageId : message.MessageId);

                        NewRequest?.Invoke(this, new UserRequestEventArgs
                        {
                            Url            = result[0],
                            RequestContext = message,
                            RequestTypes   = new List <UserRequestType> {
                                UserRequestType.Pdf, UserRequestType.Png
                            },
                            IsPriority = Administrators.Contains(message.Chat.Id)
                        });
                    }
                    else
                    {
                        // if is not valid URL
                        await _bot.SendTextMessageAsync(
                            message.Chat,
                            "Sorry, this is not a valid URL",
                            replyToMessageId : message.MessageId
                            );
                    }
                }
            }
            catch (Exception e)
            {
                // if we do not process error, the error will be persist when bot restarts.
                // so we end up here.
                Logger.Error($"Something happened. Exception:\n{e}");
            }
        }
コード例 #3
0
ファイル: DataStorage.cs プロジェクト: ForeverFast/MemeFolder
        public void NavigateByMemeTag(Guid guid)
        {
            IEnumerable <Meme> memes = Memes.Where(meme => meme.Tags.FirstOrDefault(m => m.MemeTag.Id == guid) != null);

            NewRequest?.Invoke(memes);
        }
コード例 #4
0
ファイル: DataStorage.cs プロジェクト: ForeverFast/MemeFolder
        public void NavigateByRequest(Func <Meme, bool> func)
        {
            IEnumerable <Meme> memes = Memes.Where(func);

            NewRequest?.Invoke(memes);
        }