private void ClientOnOnMessageReceived(NewMessage obj) { try { _client.ConversationLookup.TryGetValue(obj.channel, out var conversation); _client.UserLookup.TryGetValue(obj.user, out var user); var chatType = BotChatType.Channel; var chatId = obj.channel; var chatName = obj.channel; if (conversation is Channel cnn) { chatType = cnn.is_group ? BotChatType.Group : BotChatType.Channel; chatName = cnn.name; } else if (conversation is DirectMessageConversation dmc) { chatType = BotChatType.Private; if (_client.UserLookup.TryGetValue(dmc.user, out var privateUser)) { chatName = privateUser.name; } else { chatName = dmc.user; } } var message = new BotTextMessage { Id = obj.id.ToString(), Date = obj.ts, Text = obj.text, Chat = new BotChat { ChatType = chatType, Id = chatId, Name = chatName }, User = new SlackBotUser { Id = user?.id ?? obj.user, Name = user?.name ?? obj.user, Color = user?.color, Presence = user?.presence, Email = user?.profile?.email, FirstName = user?.profile?.first_name, LastName = user?.profile?.last_name, RealName = user?.profile?.real_name, Skype = user?.profile?.skype, Phone = user?.profile?.phone } }; TextMessageReceived?.Invoke(this, new EventArgs <BotTextMessage>(message)); } catch (Exception ex) { Core.Log.Write(ex); } }
private void MessageLoop() { var packet = new List <byte>(); var messageOpcode = 0x0; using (var messageBuffer = new MemoryStream()) { while (_client.Connected) { packet.Clear(); var ab = _client.Available; if (ab == 0) { continue; } packet.Add((byte)_clientStream.ReadByte()); var fin = (packet[0] & (1 << 7)) != 0; var rsv1 = (packet[0] & (1 << 6)) != 0; var rsv2 = (packet[0] & (1 << 5)) != 0; var rsv3 = (packet[0] & (1 << 4)) != 0; // Must error if is set. //if (rsv1 || rsv2 || rsv3) // return; var opcode = packet[0] & ((1 << 4) - 1); switch (opcode) { case 0x0: // Continuation Frame break; case 0x1: // Text case 0x2: // Binary case 0x8: // Connection Close messageOpcode = opcode; break; case 0x9: continue; // Ping case 0xA: continue; // Pong default: continue; // Reserved } packet.Add((byte)_clientStream.ReadByte()); var masked = IsMasking = (packet[1] & (1 << 7)) != 0; var pseudoLength = packet[1] - (masked ? 128 : 0); ulong actualLength = 0; if (pseudoLength > 0 && pseudoLength < 125) { actualLength = (ulong)pseudoLength; } else if (pseudoLength == 126) { var length = new byte[2]; _clientStream.Read(length, 0, length.Length); packet.AddRange(length); Array.Reverse(length); actualLength = BitConverter.ToUInt16(length, 0); } else if (pseudoLength == 127) { var length = new byte[8]; _clientStream.Read(length, 0, length.Length); packet.AddRange(length); Array.Reverse(length); actualLength = BitConverter.ToUInt64(length, 0); } var mask = new byte[4]; if (masked) { _clientStream.Read(mask, 0, mask.Length); packet.AddRange(mask); } if (actualLength > 0) { var data = new byte[actualLength]; _clientStream.Read(data, 0, data.Length); packet.AddRange(data); if (masked) { data = ApplyMask(data, mask); } messageBuffer.Write(data, 0, data.Length); } LogRequest?.Invoke(this, new LogEventArgs($@"RECV: {BitConverter.ToString(packet.ToArray())}")); if (!fin) { continue; } var message = messageBuffer.ToArray(); switch (messageOpcode) { case 0x1: AnyMessageReceived?.Invoke(this, message); TextMessageReceived?.Invoke(this, Encoding.UTF8.GetString(message)); break; case 0x2: AnyMessageReceived?.Invoke(this, message); BinaryMessageReceived?.Invoke(this, Encoding.UTF8.GetString(message)); break; case 0x8: Close(); break; default: throw new Exception("Invalid opcode: " + messageOpcode); } messageBuffer.SetLength(0); } } }
private void MessageLoop() { WebSocketSession session = this; TcpClient client = session.Client; Stream stream = session.ClientStream; List <byte> packet = new List <byte>(); int messageOpcode = 0x0; using (MemoryStream messageBuffer = new MemoryStream()) while (client.Connected) { packet.Clear(); int ab = client.Available; if (ab == 0) { continue; } packet.Add((byte)stream.ReadByte()); bool fin = (packet[0] & (1 << 7)) != 0; bool rsv1 = (packet[0] & (1 << 6)) != 0; bool rsv2 = (packet[0] & (1 << 5)) != 0; bool rsv3 = (packet[0] & (1 << 4)) != 0; // Must error if is set. //if (rsv1 || rsv2 || rsv3) // return; int opcode = packet[0] & ((1 << 4) - 1); switch (opcode) { case 0x0: // Continuation Frame break; case 0x1: // Text case 0x2: // Binary case 0x8: // Connection Close messageOpcode = opcode; break; case 0x9: continue; // Ping case 0xA: continue; // Pong default: continue; // Reserved } packet.Add((byte)stream.ReadByte()); bool masked = (packet[1] & (1 << 7)) != 0; int pseudoLength = packet[1] - (masked ? 128 : 0); ulong actualLength = 0; if (pseudoLength > 0 && pseudoLength < 125) { actualLength = (ulong)pseudoLength; } else if (pseudoLength == 126) { byte[] length = new byte[2]; stream.Read(length, 0, length.Length); packet.AddRange(length); Array.Reverse(length); actualLength = BitConverter.ToUInt16(length, 0); } else if (pseudoLength == 127) { byte[] length = new byte[8]; stream.Read(length, 0, length.Length); packet.AddRange(length); Array.Reverse(length); actualLength = BitConverter.ToUInt64(length, 0); } byte[] mask = new byte[4]; if (masked) { stream.Read(mask, 0, mask.Length); packet.AddRange(mask); } if (actualLength > 0) { byte[] data = new byte[actualLength]; stream.Read(data, 0, data.Length); packet.AddRange(data); if (masked) { data = ApplyMask(data, mask); } messageBuffer.Write(data, 0, data.Length); } Console.WriteLine($@"RECV: {BitConverter.ToString(packet.ToArray())}"); if (!fin) { continue; } byte[] message = messageBuffer.ToArray(); switch (messageOpcode) { case 0x1: AnyMessageReceived?.Invoke(session, message); TextMessageReceived?.Invoke(session, Encoding.UTF8.GetString(message)); break; case 0x2: AnyMessageReceived?.Invoke(session, message); BinaryMessageReceived?.Invoke(session, Encoding.UTF8.GetString(message)); break; case 0x8: Close(); break; default: throw new Exception("Invalid opcode: " + messageOpcode); } messageBuffer.SetLength(0); } }
private async void Bot_OnMessage(object sender, TBot.Args.MessageEventArgs e) { try { if (e.Message is null) { return; } switch (e.Message.Type) { case TBot.Types.Enums.MessageType.Text: if (string.IsNullOrWhiteSpace(e.Message.Text)) { return; } var message = new BotTextMessage { Id = e.Message.MessageId.ToString(), Date = e.Message.Date, Text = e.Message.Text, Chat = new TelegramBotChat { Id = e.Message.Chat.Id.ToString(), ChatType = (BotChatType)e.Message.Chat.Type, Name = e.Message.Chat.Title, Title = e.Message.Chat.Title, Username = e.Message.Chat.Username, FirstName = e.Message.Chat.FirstName, LastName = e.Message.Chat.LastName }, User = new TelegramBotUser { Id = e.Message.From.Id.ToString(), Name = e.Message.From.Username, FirstName = e.Message.From.FirstName, LastName = e.Message.From.LastName } }; TextMessageReceived?.Invoke(this, new EventArgs <BotTextMessage>(message)); break; case TBot.Types.Enums.MessageType.Photo: foreach (var photo in e.Message.Photo) { var photoFileInfo = await _bot.GetFileAsync(photo.FileId); var photoMessage = new BotPhotoMessage { Id = e.Message.MessageId.ToString(), Date = e.Message.Date, PhotoWidth = photo.Width, PhotoHeight = photo.Height, PhotoId = photo.FileId, PhotoSize = photo.FileSize, PhotoName = photoFileInfo.FilePath, PhotoStream = new Lazy <Stream>(() => { var ms = new MemoryStream(); _bot.DownloadFileAsync(photoFileInfo.FilePath, ms).WaitAsync(); return(ms); }), Chat = new TelegramBotChat { Id = e.Message.Chat.Id.ToString(), ChatType = (BotChatType)e.Message.Chat.Type, Name = e.Message.Chat.Title, Title = e.Message.Chat.Title, Username = e.Message.Chat.Username, FirstName = e.Message.Chat.FirstName, LastName = e.Message.Chat.LastName }, User = new TelegramBotUser { Id = e.Message.From.Id.ToString(), Name = e.Message.From.Username, FirstName = e.Message.From.FirstName, LastName = e.Message.From.LastName } }; PhotoMessageReceived?.Invoke(this, new EventArgs <BotPhotoMessage>(photoMessage)); } break; } } catch (Exception ex) { Core.Log.Write(ex); } }
private void Bot_OnMessage(object sender, TBot.Args.MessageEventArgs e) { if (e.Message == null) { return; } switch (e.Message.Type) { case TBot.Types.Enums.MessageType.TextMessage: if (string.IsNullOrWhiteSpace(e.Message.Text)) { return; } var message = new BotTextMessage { Id = e.Message.MessageId.ToString(), Date = e.Message.Date, Text = e.Message.Text, Chat = new TelegramBotChat { Id = e.Message.Chat.Id.ToString(), ChatType = (BotChatType)e.Message.Chat.Type, Name = e.Message.Chat.Title, Title = e.Message.Chat.Title, Username = e.Message.Chat.Username, FirstName = e.Message.Chat.FirstName, LastName = e.Message.Chat.LastName }, User = new TelegramBotUser { Id = e.Message.From.Id.ToString(), Name = e.Message.From.Username, FirstName = e.Message.From.FirstName, LastName = e.Message.From.LastName } }; TextMessageReceived?.Invoke(this, new EventArgs <BotTextMessage>(message)); break; case TBot.Types.Enums.MessageType.PhotoMessage: foreach (var photo in e.Message.Photo) { var photoMessage = new BotPhotoMessage { Id = e.Message.MessageId.ToString(), Date = e.Message.Date, PhotoWidth = photo.Width, PhotoHeight = photo.Height, PhotoId = photo.FileId, PhotoSize = photo.FileSize, PhotoName = photo.FilePath, PhotoStream = new Lazy <Stream>(() => { var file = _bot.GetFileAsync(photo.FileId).WaitAndResults(); return(file.FileStream); }), Chat = new TelegramBotChat { Id = e.Message.Chat.Id.ToString(), ChatType = (BotChatType)e.Message.Chat.Type, Name = e.Message.Chat.Title, Title = e.Message.Chat.Title, Username = e.Message.Chat.Username, FirstName = e.Message.Chat.FirstName, LastName = e.Message.Chat.LastName }, User = new TelegramBotUser { Id = e.Message.From.Id.ToString(), Name = e.Message.From.Username, FirstName = e.Message.From.FirstName, LastName = e.Message.From.LastName } }; PhotoMessageReceived?.Invoke(this, new EventArgs <BotPhotoMessage>(photoMessage)); } break; } }