diff --git a/MinecraftClient/config/ChatBots/VkMessager.cs b/MinecraftClient/config/ChatBots/VkMessager.cs index 9e801089..9c2502ce 100644 --- a/MinecraftClient/config/ChatBots/VkMessager.cs +++ b/MinecraftClient/config/ChatBots/VkMessager.cs @@ -97,10 +97,10 @@ internal class VkLongPoolClient private WebClient ReceiverWebClient { get; set; } private WebClient SenderWebClient { get; set; } private string Token { get; set; } - private string LastTs { get; set; } + private int LastTs { get; set; } private string Server { get; set; } private string Key { get; set; } - private Action OnMessageReceivedCallback { get; set; } + private Action OnMessageReceivedCallback { get; set; } private string BotCommunityId { get; set; } private void Init() @@ -110,39 +110,62 @@ internal class VkLongPoolClient Key = data.Properties["response"].Properties["key"].StringValue; Server = data.Properties["response"].Properties["server"].StringValue; - LastTs = data.Properties["response"].Properties["ts"].StringValue; + LastTs = Convert.ToInt32(data.Properties["response"].Properties["ts"].StringValue); } - public void SendMessage(string chatId, string text) + public void SendMessage(string chatId, string text, int random_id = 0) { - CallVkMethod("messages.send", "peer_id=" + chatId + "&message=" + text); + if (random_id == 0) + random_id = LastTs; + + CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + random_id + "&message=" + text); } - + + public void SendSticker(string chatId, int sticker_id, int random_id = 0) + { + if (random_id == 0) + random_id = LastTs; + + CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + random_id + "&sticker_id=" + sticker_id); + } + + public void OnlineGroup(bool enable = true) + { + if (enable) + CallVkMethod("groups.enableOnline", "group_id=" + BotCommunityId); + else + CallVkMethod("groups.disableOnline", "group_id=" + BotCommunityId); + } + private void StartLongPoolAsync() { - var baseUrl = String.Format("{0}?act=a_check&version=2&wait=25&key={1}&ts=", Server, Key); Task.Factory.StartNew(() => { while (true) { + var baseUrl = String.Format("{0}?act=a_check&version=2&wait=25&key={1}&ts=", Server, Key); + var data = ReceiverWebClient.DownloadString(baseUrl + LastTs); var messages = ProcessResponse(data); foreach (var message in messages) { - OnMessageReceivedCallback(message.Item1, message.Item2); + OnMessageReceivedCallback(message.Item1, message.Item2, message.Item3); } } }); } - private IEnumerable> ProcessResponse(string jsonData) + private IEnumerable> ProcessResponse(string jsonData) { var data = Json.ParseJson(jsonData); - LastTs = data.Properties["ts"].StringValue; + if (data.Properties.ContainsKey("failed")) // Update Key on Server Error + Init(); + + LastTs = Convert.ToInt32(data.Properties["ts"].StringValue); var updates = data.Properties["updates"].DataArray; - var messages = new List>(); + var messages = new List>(); foreach (var str in updates) { if (str.Properties["type"].StringValue != "message_new") continue; @@ -150,19 +173,19 @@ internal class VkLongPoolClient var msgData = str.Properties["object"].Properties; var userId = msgData["from_id"].StringValue; + var peer_id = msgData["peer_id"].StringValue; var msgText = msgData["text"].StringValue; - messages.Add(new Tuple(userId, msgText)); + messages.Add(new Tuple(userId, peer_id, msgText)); } return messages; } - private string CallVkMethod(string methodName, string data) { - var url = String.Format("https://api.vk.com/method/{0}?v=5.80&access_token={1}&{2}", methodName, Token, data); + var url = String.Format("https://api.vk.com/method/{0}?v=5.120&access_token={1}&{2}", methodName, Token, data); var jsonResult = SenderWebClient.DownloadString(url); return jsonResult; } -} \ No newline at end of file +}