//MCCScript 1.0
//using System.Threading.Tasks;
//dll Newtonsoft.Json.dll
//using Newtonsoft.Json;
//using Newtonsoft.Json.Linq;
//==== INFO START ====
// Download Newtonsoft.Json.dll and install it into the program folder Link: https://www.newtonsoft.com/json
//==== INFO END ====
//==== CONFIG START ====
string vkToken = "";
string chatId = "";
string botCommunityId = "";
//==== CONFIG END ====
MCC.LoadBot(new VkMessager(vkToken, chatId, botCommunityId));
//MCCScript Extensions
///
/// This bot forwarding messages between Minecraft and VKonrakte chats.
/// Shares only messages that starts with dot ("."). Example: .Hello!
/// Also, send message to VK when any player joins or leaves.
///
/// Needs:
/// - VK Community token (also LongPool API with NewMessageEvent, api >= 5.80),
/// - VK ChatId (typically 2000000001, etc.)
/// - Bot's CommunityId
///
public class VkMessager : ChatBot
{
private VkLongPoolClient VkLongPoolClient { get; set; }
private readonly string ChatId;
///
/// This bot forwarding messages between Minecraft and VKonrakte chats.
/// Shares only messages that starts with dot ("."). Example: .Hello!
/// Also, send message to VK when any player joins or leaves.
///
/// VK Community token
/// VK ChatId
/// Bot's CommunityId
public VkMessager(string vkToken, string chatId, string botCommunityId)
{
VkLongPoolClient = new VkLongPoolClient(vkToken, botCommunityId, ProcessMsgFromVk);
ChatId = chatId;
}
public override void GetText(string text)
{
text = GetVerbatim(text);
string sender = "";
string message = "";
if (IsChatMessage(text, ref message, ref sender))
{
ProcessMsgFromMinecraft(sender, message);
}
else if (IsPrivateMessage(text, ref message, ref sender))
{
ProcessMsgFromMinecraft(sender, message);
}
else
{
ProcessMsgFromMinecraft("Server", text);
}
}
private void ProcessMsgFromVk(string senderId, string text)
{
if (!text.StartsWith(".")) return;
SendText("[VK " + senderId.Substring(0, 2) + "]: " + text.TrimStart('.'));
}
private void ProcessMsgFromMinecraft(string senderName, string text)
{
if (!text.StartsWith(".") && !text.Contains("left") && !text.Contains("joined")) return;
if (text.Contains("[VK")) return; // loop protection
VkLongPoolClient.SendMessage(ChatId, String.Format("[MC {0}]\r\n{1}", senderName, text.TrimStart('.')));
}
}
///
/// Client for VK Community (bot) LongPool API.
/// Also can send messages.
///
internal class VkLongPoolClient
{
/* VK Client*/
public VkLongPoolClient(string token, string botCommunityId, Action onMessageReceivedCallback, IWebProxy webProxy = null)
{
Token = token;
BotCommunityId = botCommunityId;
OnMessageReceivedCallback = onMessageReceivedCallback;
ReceiverWebClient = new WebClient() { Proxy = webProxy, Encoding = Encoding.UTF8 };
SenderWebClient = new WebClient() { Proxy = webProxy, Encoding = Encoding.UTF8 };
Init();
StartLongPoolAsync();
}
private WebClient ReceiverWebClient { get; set; }
private WebClient SenderWebClient { get; set; }
private string Token { get; set; }
private int LastTs { get; set; }
private string Server { get; set; }
private string Key { get; set; }
private Action OnMessageReceivedCallback { get; set; }
private string BotCommunityId { get; set; }
private Random rnd = new Random();
/* Utils */
public string Utils_GetShortLink(string url)
{
string json = CallVkMethod("utils.getShortLink", "url=" + url);
var j = JsonConvert.DeserializeObject(json) as JObject;
var link = j["response"]["short_url"].ToString();
return link;
}
/* Docs */
public string Docs_GetMessagesUploadServer(string peer_id, string type, string file)
{
string string1 = CallVkMethod("docs.getMessagesUploadServer", "peer_id=" + peer_id + "&type=" + type);
string uploadurl = Regex.Match(string1, "\"upload_url\":\"(.*)\"").Groups[1].Value.Replace(@"\/", "/");
return uploadurl;
}
public string Docs_Upload(string url, string file)
{
var c = new WebClient();
var r2 = Encoding.UTF8.GetString(c.UploadFile(url, "POST", file));
return r2;
}
public string Docs_Save(string file, string title)
{
var j2 = JsonConvert.DeserializeObject(file) as JObject;
return CallVkMethod("docs.save", "&file=" + j2["file"].ToString() + "&title=" + title);
}
public string Docs_GetSendAttachment(string file)
{
var j3 = JsonConvert.DeserializeObject(file) as JObject;
var at = "doc" + j3["response"]["doc"]["owner_id"].ToString() + "_" + j3["response"]["doc"]["id"].ToString();
return at;
}
/* Groups */
public void Groups_Online(bool enable = true)
{
if (enable)
CallVkMethod("groups.enableOnline", "group_id=" + BotCommunityId);
else
CallVkMethod("groups.disableOnline", "group_id=" + BotCommunityId);
}
public string Groups_GetById_GetName(string group_id)
{
try
{
string js = CallVkMethod("groups.getById", "group_id=" + group_id);
var j3 = JsonConvert.DeserializeObject(js) as JObject;
string name = j3["response"][0]["name"].ToString();
return name;
} catch { return ""; }
}
/* Messages */
public void Messages_Kick_Group(string chat_id, string user_id)
{
if (user_id != BotCommunityId)
CallVkMethod("messages.removeChatUser", "chat_id=" + chat_id + "&member_id=" + "-" + user_id);
}
public void Messages_Kick_User(string chat_id, string user_id)
{
CallVkMethod("messages.removeChatUser", "chat_id=" + chat_id + "&user_id=" + user_id + "&member_id=" + user_id);
}
public void Messages_SetActivity(string chatId, string type = "typing")
{
string id3 = chatId;
id3 = id3.Substring(1);
int ind = Convert.ToInt32(id3);
CallVkMethod("messages.setActivity", "user_id=" + BotCommunityId + "&peer_id=" + chatId + "&group_id=" + "&type=" + type + "&group_id=" + BotCommunityId);
CallVkMethod("messages.setActivity", "user_id=" + BotCommunityId + "&peer_id=" + ind + "&type=" + type + "&group_id=" + BotCommunityId);
}
public string Messages_GetInviteLink(string chatId, bool reset)
{
string json = "";
if (reset == true)
json = CallVkMethod("messages.getInviteLink", "peer_id=" + chatId + "&group_id=" + BotCommunityId + "&reset=1");
else
json = CallVkMethod("messages.getInviteLink", "peer_id=" + chatId + "&group_id=" + BotCommunityId);
var j = JsonConvert.DeserializeObject(json) as JObject;
var link = j["response"]["link"].ToString();
return link;
}
/* Messages Send */
public void Messages_Send_Text(string chatId, string text)
{
string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&message=" + text);
try
{
var j = JsonConvert.DeserializeObject(reply) as JObject;
if (j["error"]["error_code"].ToString() != "")
CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&message=" + text);
} catch { }
}
public void Messages_Send_Keyboard(string chatId, Keyboard keyboard)
{
string kb = keyboard.GetKeyboard();
string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&keyboard=" + kb);
try
{
var j = JsonConvert.DeserializeObject(reply) as JObject;
if (j["error"]["error_code"].ToString() != "")
CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&keyboard=" + kb);
} catch { }
}
public void Messages_Send_TextAndKeyboard(string chatId, string text, Keyboard keyboard)
{
string kb = keyboard.GetKeyboard();
string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&message=" + text + "&keyboard=" + kb);
try
{
var j = JsonConvert.DeserializeObject(reply) as JObject;
if (j["error"]["error_code"].ToString() != "")
CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&message=" + text + "&keyboard=" + kb);
} catch { }
}
public void Messages_Send_Sticker(string chatId, int sticker_id)
{
string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&sticker_id=" + sticker_id);
try
{
var j = JsonConvert.DeserializeObject(reply) as JObject;
if (j["error"]["error_code"].ToString() != "")
CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&sticker_id=" + sticker_id);
} catch { }
}
public void Messages_Send_TextAndDocument(string chatId, string text, string file, string title)
{
string u2 = Docs_GetMessagesUploadServer(chatId, "doc", file);
string r2 = Docs_Upload(u2, file);
string r3 = Docs_Save(r2, title);
string at = Docs_GetSendAttachment(r3);
string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&message=" + text + "&attachment=" + at);
try
{
var j = JsonConvert.DeserializeObject(reply) as JObject;
if (j["error"]["error_code"].ToString() != "")
CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + "&message=" + text + "&attachment=" + at);
} catch { }
}
public void Messages_Send_Custom(string chatId, string custom)
{
string reply = CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + custom);
try
{
var j = JsonConvert.DeserializeObject(reply) as JObject;
if (j["error"]["error_code"].ToString() != "")
CallVkMethod("messages.send", "peer_id=" + chatId + "&random_id=" + rnd.Next() + custom);
} catch { }
}
/* Messages GetConversationMembers*/
public int Messages_GetConversationMembers_GetCount_v1(string chatId)
{
var json = CallVkMethod("messages.getConversationMembers", "peer_id=" + chatId + "&group_id=" + BotCommunityId);
var j = JsonConvert.DeserializeObject(json) as JObject;
int u2 = int.Parse(j["response"]["count"].ToString());
return u2;
}
public string Messages_GetConversationMembers_GetProfiles(string chatId)
{
var json = CallVkMethod("messages.getConversationMembers", "peer_id=" + chatId + "&group_id=" + BotCommunityId);
string ids = "";
JObject json1 = JObject.Parse(json);
IList results = json1["response"]["profiles"].Children().ToList();
foreach (JToken result in results)
{
string id = result["id"].ToString();
if (!id.Contains("-"))
ids += id + ", ";
}
return ids;
}
public string Messages_GetConversationMembers_GetItems_member_id(string chatId)
{
var json = CallVkMethod("messages.getConversationMembers", "peer_id=" + chatId + "&group_id=" + BotCommunityId);
string ids = "";
JObject json1 = JObject.Parse(json);
IList results = json1["response"]["items"].Children().ToList();
foreach (JToken result in results)
{
string id = result["member_id"].ToString();
if (!id.Contains("-"))
ids += id + ", ";
}
return ids;
}
public class Keyboard
{
public bool one_time = false;
public List> buttons = new List>();
public bool inline = false;
public Keyboard(bool one_time2, bool line = false)
{
if (line == true && one_time2 == true)
one_time2 = false;
one_time = one_time2;
inline = line;
}
public void AddButton(string label, string payload, string color)
{
Buttons button = new Buttons(label, payload, color);
buttons.Add(new List