C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using UnityEngine;
using CompanionServer;
using Oxide.Ext.Discord.Entities;
using System.Text.RegularExpressions;
using Oxide.Core.Libraries.Covalence;
using ru = Oxide.Game.Rust;
using ConVar;
using Oxide.Ext.Discord.Builders;
using Oxide.Ext.Discord.Clients;
using Oxide.Ext.Discord.Connections;
using Oxide.Ext.Discord.Constants;
using Oxide.Ext.Discord.Extensions;
using Oxide.Ext.Discord.Interfaces;
using Oxide.Ext.Discord.Libraries;
using Oxide.Ext.Discord.Logging;
namespace Oxide.Plugins {
[Info("AAlertRaidEN", "fermens", "2.0.3")]
public class AAlertRaidEN : RustPlugin, IDiscordPlugin {
#region CONFIG
const bool fermensEN = true;
private static PluginConfig config;
protected override void LoadDefaultConfig() {
config = PluginConfig.DefaultConfig();
}
protected override void LoadConfig() {
base.LoadConfig();
config = Config.ReadObject<PluginConfig>();
}
protected override void SaveConfig() {
Config.WriteObject(config);
}
class VK {
[JsonProperty(fermensEN ? "Enable?" : "Включить?")]
public bool enable;
[JsonProperty(fermensEN ? "API" : "API от группы")]
public string api;
[JsonProperty(fermensEN ? "Link to the group" : "Ссылка на группу")]
public string link;
[JsonProperty(fermensEN ? "Cooldown for sending" : "Кд на отправку")]
public float cooldown;
}
class RUSTPLUS {
[JsonProperty(fermensEN ? "Enable?" : "Включить?")]
public bool enable;
[JsonProperty(fermensEN ? "Cooldown for sending" : "Кд на отправку")]
public float cooldown;
}
class INGAME {
[JsonProperty(fermensEN ? "Enable?" : "Включить?")]
public bool enable;
[JsonProperty(fermensEN ? "Cooldown for sending" : "Кд на отправку")]
public float cooldown;
[JsonProperty(fermensEN ? "Send game effect when notification are received" : "Эффект при получении уведомления")]
public string effect;
[JsonProperty(fermensEN ? "Time after the UI is destroyed" : "Время, через которое пропадает UI [секунды]")]
public float destroy;
[JsonProperty("UI")]
public string UI;
}
class DISCORD {
[JsonProperty(fermensEN ? "Enable?" : "Включить?")]
public bool enable;
[JsonProperty(fermensEN ? "Cooldown for sending" : "Кд на отправку")]
public float cooldown;
[JsonProperty(fermensEN ? "Invitation link" : "Приглашение в группу")]
public string link;
[JsonProperty(fermensEN ? "Token (https://discordapp.com/developers/applications)" : "Токен бота (https://discordapp.com/developers/applications)")]
public string token;
[JsonProperty(fermensEN ? "Channel ID, where the player will take the code to confirm the profile" : "ID канала, гле игрок будет брать код, для подтверджения профиля")]
public string channel;
[JsonProperty(fermensEN ? "Server ID" : "ID Сервера")]
public ulong server;
[JsonProperty(fermensEN ? "Info text" : "Дискорд канал с получением кода - текст")]
public string channeltext;
[JsonProperty(fermensEN ? "Info text - line color on the left" : "Дискорд канал с получением кода - цвет линии слева (https://gist.github.com/thomasbnt/b6f455e2c7d743b796917fa3c205f812#file-code_colors_discordjs-md)")]
public uint channelcolor;
[JsonProperty(fermensEN ? "Text on button" : "Дискорд канал с получением кода - кнопка")]
public string channelbutton;
[JsonProperty(fermensEN ? "Reply after button click" : "Дискорд канал с получением кода - ответ")]
public string channelex;
[JsonProperty(fermensEN ? "Don't touch this field" : "Дискорд канал с получением кода - ID сообщения (не трогаем! сам заполнится!)")]
public string channelmessageid;
}
class TELEGRAM {
[JsonProperty(fermensEN ? "Enable?" : "Включить?")]
public bool enable;
[JsonProperty(fermensEN ? "Cooldown for sending" : "Кд на отправку")]
public float cooldown;
[JsonProperty(fermensEN ? "Bot tag" : "Тэг бота")]
public string bottag;
[JsonProperty(fermensEN ? "Token" : "Токен")]
public string token;
}
class UIMenu {
[JsonProperty(fermensEN ? "Background color" : "Цвет фона")]
public string background;
[JsonProperty(fermensEN ? "Strip color" : "Цвет полоски")]
public string stripcolor;
[JsonProperty(fermensEN ? "Rectangular container background color" : "Цвет фона прямоугольного контейнера")]
public string rectangularcolor;
[JsonProperty(fermensEN ? "Button text color" : "Цвет текста в кнопке")]
public string buttoncolortext;
[JsonProperty(fermensEN ? "Text color" : "Цвет текста")]
public string textcolor;
[JsonProperty(fermensEN ? "Green button color" : "Цвет зелёной кнопки")]
public string greenbuttoncolor;
[JsonProperty(fermensEN ? "Red button color" : "Цвет красной кнопки")]
public string redbuttoncolor;
[JsonProperty(fermensEN ? "Gray button color" : "Цвет серой кнопки")]
public string graybuttoncolor;
[JsonProperty(fermensEN ? "Header text color" : "Цвет текста заголовка")]
public string headertextcolor;
[JsonProperty(fermensEN ? "Error text color" : "Цвет текста ошибки")]
public string errortextcolor;
[JsonProperty(fermensEN ? "Text color of <exit> and <back> buttons" : "Цвет текста кнопок <выход> и <назад>")]
public string colortextexit;
[JsonProperty(fermensEN ? "Rectangular container text color" : "Цвет текст прямоугольного контейнера")]
public string rectangulartextcolor;
[JsonProperty(fermensEN ? "The color of the text with hints at the bottom of the screen" : "Цвет текста с подсказками внизу экрана")]
public string hintstextcolor;
[JsonProperty(fermensEN ? "Abbreviations and their colors" : "Аббревиатуры и их цвета")]
public UIMainMenu uIMainMenu;
}
class UIMainMenu {
[JsonProperty(fermensEN ? "Abbreviation for telegram" : "Аббревиатура для телеграма")]
public string abr_telegram;
[JsonProperty(fermensEN ? "Telegram icon color" : "Цвет иконки телеграма")]
public string color_telegram;
[JsonProperty(fermensEN ? "Abbreviation for vk.com" : "Аббревиатура для вконтакте")]
public string abr_vk;
[JsonProperty(fermensEN ? "Vk.com icon color" : "Цвет иконки вконтакте")]
public string color_vk;
[JsonProperty(fermensEN ? "Abbreviation for rust+" : "Аббревиатура для rust+")]
public string abr_rustplus;
[JsonProperty(fermensEN ? "Rust+ icon color" : "Цвет иконки rust+")]
public string color_rustplus;
[JsonProperty(fermensEN ? "Abbreviation for discord" : "Аббревиатура для дискорда")]
public string abr_discord;
[JsonProperty(fermensEN ? "Discord icon color" : "Цвет иконки дискорда")]
public string color_discord;
[JsonProperty(fermensEN ? "Abbreviation for in game" : "Аббревиатура для графическое отображение в игре")]
public string abr_ui;
[JsonProperty(fermensEN ? "In game icon color" : "Цвет иконки графическое отображение в игре")]
public string color_ui;
}
private class PluginConfig {
[JsonProperty(fermensEN ? "Server name, will using for alerts" : "Название сервера - для оповещений")]
public string servername;
[JsonProperty(fermensEN ? "Raid alert works only for those who have permission" : "Оповещение о рейде работает только для тех, у кого есть разрешение")]
public bool needpermission;
[JsonProperty(fermensEN ? "VK.com" : "Оповещание о рейде в ВК")]
public VK vk;
[JsonProperty(fermensEN ? "Rust+" : "Оповещание о рейде в Rust+")]
public RUSTPLUS rustplus;
[JsonProperty(fermensEN ? "In game" : "Оповещание о рейде в игре")]
public INGAME ingame;
[JsonProperty(fermensEN ? "Discord" : "Оповещание о рейде в дискорд")]
public DISCORD discord;
[JsonProperty(fermensEN ? "Telegram" : "Оповещание о рейде в телеграм")]
public TELEGRAM telegram {
get;
set;
}
= new TELEGRAM {
token = "", cooldown = 1200f, enable = true, bottag = "@haxlite_bot"
}
;
[JsonProperty(fermensEN ? "Menu UI" : "Настройка UI")]
public UIMenu ui {
get;
set;
}
= new UIMenu {
background = "0.07843138 0.06666667 0.1098039 0.9490196", stripcolor = "0.8784314 0.9843137 1 0.5686275", rectangularcolor = "0.8901961 0.8901961 0.8901961 0.4156863", graybuttoncolor = "0.8901961 0.8901961 0.8901961 0.4156863", buttoncolortext = "1 1 1 0.9056942", rectangulartextcolor = "1 1 1 0.7843137", textcolor = "1 1 1 1", headertextcolor = "1 1 1 1", hintstextcolor = "1 1 1 0.6699298", greenbuttoncolor = "0.5450981 1 0.6941177 0.509804", errortextcolor = "1 0.5429931 0.5429931 0.787812", colortextexit = "0.5938045 0.5789595 0.5789595 1", redbuttoncolor = "1 0.5450981 0.5450981 0.509804", uIMainMenu = new UIMainMenu {
abr_discord = "DS", abr_rustplus = "R+", abr_telegram = "TG", abr_ui = "UI", abr_vk = "VK", color_discord = "0.6313726 0.5764706 1 0.4156863", color_rustplus = "1 0.5803921 0.6013725 0.4156863", color_vk = "0.5803922 0.6627451 1 0.4156863", color_ui = "1 0.7843137 0.5764706 0.4156863", color_telegram = "0.5479987 0.9459876 1 0.4156863"
}
}
;
[JsonProperty(fermensEN ? "Additional list" : "Дополнительный список предметов, которые учитывать")]
public string[] spisok;
[JsonProperty(fermensEN ? "Notification when usual items are destroyed" : "Оповещение при уничтожении обычных предметов")]
public bool extralist;
public static PluginConfig DefaultConfig() {
return new PluginConfig() {
servername = "HaxLite X10", vk = new VK {
api = "", cooldown = 1200f, enable = true,
}
, rustplus = new RUSTPLUS {
cooldown = 600f, enable = true
}
, ingame = new INGAME {
cooldown = 60f, enable = true, effect = "assets/prefabs/weapons/toolgun/effects/repairerror.prefab", destroy = 4f, UI = "[{\"name\":\"UIA\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"material\":\"assets/content/ui/uibackgroundblur.mat\", \"sprite\":\"assets/content/ui/ui.background.transparent.linearltr.tga\",\"color\":\"0 0 0 0.6279221\"},{\"type\":\"RectTransform\",\"anchormin\":\"1 0.5\",\"anchormax\":\"1 0.5\",\"offsetmin\":\"-250 -30\",\"offsetmax\":\"0 30\"}]},{\"name\":\"D\",\"parent\":\"UIA\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"1 0 0 0.392904\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 0\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 5\"}]},{\"name\":\"T\",\"parent\":\"UIA\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{text}\",\"fontSize\":12,\"align\":\"MiddleLeft\",\"color\":\"1 1 1 0.8644356\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"5 0\",\"offsetmax\":\"-5 0\"}]},{\"name\":\"U\",\"parent\":\"UIA\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"1 0 0 0.3921569\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 1\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 -5\",\"offsetmax\":\"0 0\"}]}]"
}
, discord = new DISCORD {
cooldown = 600f, enable = true, token = "", channel = "", channelbutton = fermensEN ? "Get code" : "Получить код", channelex = fermensEN ? "Your code: {code}" : "Ваш код: {code}", channelmessageid = "", channeltext = fermensEN ? "Enter the received code in the integration menu for raid alerts.\nChat command /raid\nEnter it in the game itself, not in the discord!" : "Введите полученый код в меню интеграции дискорда с игровым профилем.\nЧат команда /raid\nВводить в самой игре, а не в дискорде!", channelcolor = 14177041
}
, spisok = _spisok
}
;
}
}
private static string[] _spisok = new string[] {
"wall.external.high", "wall.external.high.stone", "gates.external.high.wood", "gates.external.high.stone", "wall.window.bars.metal", "wall.window.bars.toptier", "wall.window.glass.reinforced", "wall.window.bars.wood"
}
;
#endregion
#region DISCORD
private readonly BotConnection _discordSettings = new BotConnection {
Intents = GatewayIntents.GuildMessages | GatewayIntents.DirectMessages | GatewayIntents.Guilds | GatewayIntents.GuildMembers
}
;
private DiscordGuild _guild;
public DiscordClient Client {
get;
set;
}
private void CreateClient() {
_discordSettings.ApiToken = config.discord.token;
_discordSettings.LogLevel = Ext.Discord.Logging.DiscordLogLevel.Error;
Client.Connect(_discordSettings);
timer.Once(5f, () => {
try {
if (Client == null) {
CreateClient();
Debug.Log("Discord reconnecting in 5 sec...");
}
else {
_guild = Client.Bot.GetGuild(new Snowflake(config.discord.server));
Debug.Log(fermensEN ? $"DISCORD BOT CONNECTED TO {_guild.Name}." : $"DISCORD БОТ АВТОРИЗОВАН НА СЕРВЕРЕ {_guild.Name}.");
DiscordChannel channel;
if (!_guild.Channels.TryGetValue(new Snowflake(config.discord.channel), out channel)) {
Debug.Log(fermensEN ? $"CHANNEL NOT FOUND! ({_guild.Channels.Count})" : $"КАНАЛ НЕ СУЩЕСТВУЕТ! ({_guild.Channels.Count})");
return;
}
var embeds = new List<DiscordEmbed> {
new DiscordEmbed {
Color = new DiscordColor(config.discord.channelcolor), Description = config.discord.channeltext
}
}
;
var components = CreateComponents(config.discord.channelbutton);
if (!string.IsNullOrEmpty(config.discord.channelmessageid) && ulong.TryParse(config.discord.channelmessageid, out ulong num) && num < 9223372036854775807) {
channel.GetMessage(Client, new Snowflake(config.discord.channelmessageid)).Then(message => {
message.Edit(Client, new MessageUpdate {
Embeds = embeds, Components = components
}
);
}
).Catch(error => {
DiscordCreateMessage(channel, embeds, components);
}
);
}
else {
DiscordCreateMessage(channel, embeds, components);
}
}
}
catch {
}
}
);
}
private void DiscordCreateMessage(DiscordChannel channel, List<DiscordEmbed> embeds, List<ActionRowComponent> components) {
var promise = channel?.CreateMessage(Client, new MessageCreate {
Embeds = embeds, Components = components
}
).Then(message => {
config.discord.channelmessageid = message.Id;
SaveConfig();
}
);
}
[HookMethod(DiscordExtHooks.OnDiscordInteractionCreated)]
private void OnDiscordInteractionCreated(DiscordInteraction interaction) {
if (interaction.Type != InteractionType.MessageComponent) {
return;
}
if (!interaction.Data.ComponentType.HasValue || interaction.Data.ComponentType.Value != MessageComponentType.Button || interaction.Data.CustomId != $"{Name}_{ConVar.Server.ip}_{ConVar.Server.port}") {
return;
}
DiscordUser user = interaction.User ?? interaction.Member?.User;
HandleAcceptLinkButton(interaction, user);
}
private void HandleAcceptLinkButton(DiscordInteraction interaction, DiscordUser user) {
string num;
if (!DISCORDCODES.TryGetValue(user.Id.Id, out num)) {
num = DISCORDCODES[user.Id.Id] = RANDOMNUM();
}
string linkMessage = Formatter.ToPlaintext(config.discord.channelex.Replace("{code}", num));
interaction.CreateResponse(Client, new InteractionResponse {
Type = InteractionResponseType.ChannelMessageWithSource, Data = new InteractionCallbackData {
Content = linkMessage, Flags = MessageFlags.Ephemeral
}
}
);
}
private void CloseClient() {
if (Client != null) Client.Disconnect();
}
private void CREATECHANNEL(string dsid, string text) {
Snowflake ss = new Snowflake(dsid);
if (!_guild.Members.Any(x => x.Value.User.Id == ss)) return;
_guild.Members.First(x => x.Value.User.Id == ss).Value.User.SendDirectMessage(Client, new MessageCreate {
Content = text
}
);
}
private void SENDMESSAGE(string dsid, string text) {
DiscordChannel channel = _guild.GetChannel(dsid);
if (channel != null) {
channel?.CreateMessage(Client, text);
}
else {
CREATECHANNEL(dsid, text);
}
}
public List<ActionRowComponent> CreateComponents(string button) {
MessageComponentBuilder builder = new MessageComponentBuilder();
builder.AddActionButton(ButtonStyle.Success, button, $"{Name}_{ConVar.Server.ip}_{ConVar.Server.port}", false);
return builder.Build();
}
private readonly List<Regex> _regexTags = new List<Regex> {
new Regex("<color=.+?>", RegexOptions.Compiled), new Regex("<size=.+?>", RegexOptions.Compiled)
}
;
private readonly List<string> _tags = new List<string> {
"</color>", "`", "</size>", "<i>", "</i>", "<b>", "</b>"
}
;
private string STRIP(string original) {
if (string.IsNullOrEmpty(original)) {
return string.Empty;
}
foreach (string tag in _tags) {
original = original.Replace(tag, "");
}
foreach (Regex regexTag in _regexTags) {
original = regexTag.Replace(original, "");
}
return original;
}
private DiscordChannel GetChannel(string id) {
return _guild.Channels.FirstOrDefault(x => x.Key.ToString() == id).Value;
}
#endregion
#region STORAGE
string connect = "14.02.22:1406";
//{fon}
string FON = "";
string MAIN = "";
string UI = "";
string IF2 = "";
string IF2A = "";
string BTN = "";
string ER = "";
string IBLOCK = "";
string MAINH = "";
string AG = "";
string EXIT = "";
string BACK = "";
#region Data
class Storage {
public string vk;
public string telegram;
public ulong discord;
public bool rustplus;
public bool ingamerust {
get;
set;
}
= true;
}
#region fermens#8767
#endregion
private Storage GetStorage(ulong userid) {
Storage storage;
if (datas.TryGetValue(userid, out storage)) return storage;
string useridstring = userid.ToString();
if (!Interface.Oxide.DataFileSystem.ExistsDatafile($"AAlertRaid/{useridstring}")) {
storage = new Storage();
datas.Add(userid, storage);
return storage;
}
storage = Interface.Oxide.DataFileSystem.ReadObject<Storage>($"AAlertRaid/{useridstring}");
datas.Add(userid, storage);
return storage;
}
private void SaveStorage(BasePlayer player) {
Storage storage;
if (datas.TryGetValue(player.userID, out storage)) {
ServerMgr.Instance.StartCoroutine(Saving(player.UserIDString, storage));
}
}
private IEnumerator Saving(string userid, Storage storage) {
yield return new WaitForSeconds(1f);
Interface.Oxide.DataFileSystem.WriteObject($"AAlertRaid/{userid}", storage);
}
Dictionary<ulong, Storage> datas = new Dictionary<ulong, Storage>();
#endregion
#endregion
#region API TELEGRAM
private void GetRequestTelegram(string reciverID, string msg, BasePlayer player = null, bool accept = false) => webrequest.Enqueue($"https://api.telegram.org/bot" + config.telegram.token + "/sendMessage?chat_id=" + reciverID + "&text=" + Uri.EscapeDataString(msg), null, (code2, response2) => ServerMgr.Instance.StartCoroutine(GetCallbackTelegram(code2, response2, reciverID, player, accept)), this);
private IEnumerator GetCallbackTelegram(int code, string response, string id, BasePlayer player = null, bool accept = false) {
if (player == null || response == null) yield break;
if (code == 401) {
Debug.LogError("[AlertRaid] Telegram token not valid!");
}
else if (code == 200) {
if (!response.Contains("error_code")) {
ALERT aLERT;
if (alerts.TryGetValue(player.userID, out aLERT)) {
aLERT.vkcodecooldown = DateTime.Now.AddMinutes(1);
}
else {
alerts.Add(player.userID, new ALERT {
telegramcodecooldown = DateTime.Now.AddMinutes(1)
}
);
}
Storage storage = GetStorage(player.userID);
storage.telegram = id;
SaveStorage(player);
write[player.userID] = "";
OpenMenu(player, false);
}
}
else {
SendError(player, "telegramuseridnotfound");
}
yield break;
}
#endregion
#region API VK
const string connects = "001.002.2022:1508";
class ALERT {
public DateTime gamecooldown;
public DateTime rustpluscooldown;
public DateTime vkcooldown;
public DateTime discordcooldown;
public DateTime vkcodecooldown;
public DateTime telegramcooldown;
public DateTime telegramcodecooldown;
}
private static Dictionary<ulong, ALERT> alerts = new Dictionary<ulong, ALERT>();
class CODE {
public string id;
public ulong gameid;
}
private Dictionary<string, CODE> VKCODES = new Dictionary<string, CODE>();
private Dictionary<ulong, string> DISCORDCODES = new Dictionary<ulong, string>();
private void GetRequest(string reciverID, string msg, BasePlayer player = null, string num = null) => webrequest.Enqueue("https://api.vk.com/method/messages.send?domain=" + reciverID + "&message=" + Uri.EscapeDataString(msg) + "&v=5.81&access_token=" + config.vk.api, null, (code2, response2) => ServerMgr.Instance.StartCoroutine(GetCallbackVK(code2, response2, reciverID, player, num)), this);
private void SendError(BasePlayer player, string key) {
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "ER");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", ER.Replace("{e0}", GetMessage(key, player.UserIDString)));
}
private IEnumerator GetCallbackVK(int code, string response, string id, BasePlayer player = null, string num = null) {
if (player == null) yield break;
if (response == null || code != 200) {
ALERT alert;
if (alerts.TryGetValue(player.userID, out alert)) alert.vkcooldown = DateTime.Now;
Debug.Log("НЕ ПОЛУЧИЛОСЬ ОТПРАВИТЬ СООБЩЕНИЕ В ВК! => обнулили кд на отправку");
yield break;
}
yield return new WaitForEndOfFrame();
if (!response.Contains("error")) {
ALERT aLERT;
if (alerts.TryGetValue(player.userID, out aLERT)) {
aLERT.vkcodecooldown = DateTime.Now.AddMinutes(1);
}
else {
alerts.Add(player.userID, new ALERT {
vkcodecooldown = DateTime.Now.AddMinutes(1)
}
);
}
if (VKCODES.ContainsKey(num)) VKCODES.Remove(num);
VKCODES.Add(num, new CODE {
gameid = player.userID, id = id
}
);
write[player.userID] = "";
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "ER");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "BTN");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", IBLOCK);
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", BTN.Replace("{text1}", GetMessage("{text1}", player.UserIDString)).Replace("{color}", "1 1 1 0.509804"));
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", IF2.Replace("{t3}", GetMessage("{t4}", player.UserIDString)).Replace("{coma}", "").Replace("{text2}", GetMessage("{text2}", player.UserIDString)));
}
else if (response.Contains("PrivateMessage")) {
SendError(player, "rnprivate");
}
else if (response.Contains("ErrorSend")) {
SendError(player, "rnerror");
}
else if (response.Contains("BlackList")) {
SendError(player, "rnblack");
}
else {
SendError(player, "rnerror2");
}
yield break;
}
#endregion
#region COMMANDS
private string perm = "discord fermens#8767";
[PluginReference]
Plugin BMenu;
private void callcommandrn(BasePlayer player, string command, string[] arg) {
OpenMenu(player);
}
private bool HasAcces(string id) {
if (!config.needpermission) return true;
return permission.UserHasPermission(id, perm);
}
private void OpenMenu(BasePlayer player, bool first = true) {
if (!HasAcces(player.UserIDString)) {
player.ChatMessage(GetMessage("permission", player.UserIDString));
return;
}
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "SubContent_UI");
if (first) {
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "Main_UI");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", FON);
if (BMenu != null) {
BMenu.Call("DestroyProfileLayers", player);
BMenu.Call("SetPage", (ulong)player.userID, "raid");
BMenu.Call("SetActivePButton", player, "raid");
}
}
//0.5450981 1 0.6941177 0.509804
//{\"name\":\"Main_UI\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.07843138 0.06666667 0.1098039 0.9490196\",\"material\":\"assets/content/ui/uibackgroundblur.mat\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", MAIN);
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "E");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", EXIT.Replace("{t7}", GetMessage("{t7}", player.UserIDString)));
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", MAINH.Replace("{a0}", GetMessage("{amain}", player.UserIDString)));
int num = 0;
Storage storage = GetStorage(player.userID);
#region VK
if (config.vk.enable && !string.IsNullOrEmpty(config.vk.api)) {
if (!string.IsNullOrEmpty(storage.vk)) AddElementUI(player, GetMessage("{element_vk}", player.UserIDString), config.ui.graybuttoncolor, GetMessage("{element_disable}", player.UserIDString), "raid.vkdelete", config.ui.uIMainMenu.abr_vk, config.ui.uIMainMenu.color_vk, num);
else AddElementUI(player, GetMessage("{element_vk}", player.UserIDString), config.ui.greenbuttoncolor, GetMessage("{element_setup}", player.UserIDString), "raid.vkadd", config.ui.uIMainMenu.abr_vk, config.ui.uIMainMenu.color_vk, num);
num++;
}
#endregion
#region Telegram
if (config.telegram.enable && !string.IsNullOrEmpty(config.telegram.token)) {
if (!string.IsNullOrEmpty(storage.telegram)) AddElementUI(player, GetMessage("{element_telegram}", player.UserIDString), config.ui.graybuttoncolor, GetMessage("{element_disable}", player.UserIDString), "raid.tgdelete", config.ui.uIMainMenu.abr_telegram, config.ui.uIMainMenu.color_telegram, num);
else AddElementUI(player, GetMessage("{element_telegram}", player.UserIDString), config.ui.greenbuttoncolor, GetMessage("{element_setup}", player.UserIDString), "raid.tgadd", config.ui.uIMainMenu.abr_telegram, config.ui.uIMainMenu.color_telegram, num);
num++;
}
#endregion
#region Rust+
if (config.rustplus.enable && !string.IsNullOrEmpty(App.serverid) && App.port > 0 && App.notifications) {
if (!storage.rustplus) AddElementUI(player, GetMessage("{element_rustplus}", player.UserIDString), config.ui.greenbuttoncolor, GetMessage("{element_enable}", player.UserIDString), "raid.rustplus", config.ui.uIMainMenu.abr_rustplus, config.ui.uIMainMenu.color_rustplus, num);
else AddElementUI(player, GetMessage("{element_rustplus}", player.UserIDString), config.ui.graybuttoncolor, GetMessage("{element_disable}", player.UserIDString), "raid.rustplus", config.ui.uIMainMenu.abr_rustplus, config.ui.uIMainMenu.color_rustplus, num);
num++;
}
#endregion
#region InGame
if (config.ingame.enable) {
if (!storage.ingamerust) AddElementUI(player, GetMessage("{element_ingame}", player.UserIDString), config.ui.greenbuttoncolor, GetMessage("{element_enable}", player.UserIDString), "raid.ingame", config.ui.uIMainMenu.abr_ui, config.ui.uIMainMenu.color_ui, num);
else AddElementUI(player, GetMessage("{element_ingame}", player.UserIDString), config.ui.graybuttoncolor, GetMessage("{element_disable}", player.UserIDString), "raid.ingame", config.ui.uIMainMenu.abr_ui, config.ui.uIMainMenu.color_ui, num);
num++;
}
#endregion
#region Discord
if (config.discord.enable && !string.IsNullOrEmpty(config.discord.token)) {
if (storage.discord == 0UL) AddElementUI(player, GetMessage("{element_discord}", player.UserIDString), config.ui.greenbuttoncolor, GetMessage("{element_setup}", player.UserIDString), "raid.discordadd", config.ui.uIMainMenu.abr_discord, config.ui.uIMainMenu.color_discord, num);
else {
AddElementUI(player, GetMessage("{element_discord}", player.UserIDString), config.ui.graybuttoncolor, GetMessage("{element_disable}", player.UserIDString), "raid.discorddelete", config.ui.uIMainMenu.abr_discord, config.ui.uIMainMenu.color_discord, num);
}
num++;
}
#endregion
}
class C {
public string min;
public string max;
}
Dictionary<int, C> _caddele = new Dictionary<int, C>();
private void AddElementUI(BasePlayer player, string name, string color, string button, string command, string ico, string icocolor, int num) {
C ce;
if (!_caddele.TryGetValue(num, out ce)) {
ce = new C();
float start = 60f;
float e = 30f;
float p = 35f;
float max = start - (num * p);
ce.min = (max - e).ToString();
ce.max = max.ToString();
_caddele.Add(num, ce);
}
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", AG.Replace("{num}", num.ToString()).Replace("{id}", name).Replace("{coma}", command).Replace("{ico}", ico).Replace("{icocolor}", icocolor).Replace("{color}", color).Replace("{text1}", button).Replace("{min}", ce.min).Replace("{max}", ce.max));
}
Dictionary<ulong, string> write = new Dictionary<ulong, string>();
[ConsoleCommand("raid.input")]
void ccmdopeinput(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
string text = arg.HasArgs() ? string.Join(" ", arg.Args) : null;
write[player.userID] = text;
}
private void SendError2(BasePlayer player, string key) {
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "BTN2");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", IF2A.Replace("{text2}", GetMessage(key, player.UserIDString)).Replace("{coma}", "").Replace("{color}", config.ui.redbuttoncolor));
timer.Once(1f, () => {
if (!player.IsConnected) return;
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "BTN2");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", IF2A.Replace("{text2}", GetMessage("{text2}", player.UserIDString)).Replace("{coma}", "raid.accept").Replace("{color}", config.ui.greenbuttoncolor));
}
);
}
#region InGame Comand
[ConsoleCommand("raid.ingame")]
void raplsgame(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
Storage storage = GetStorage(player.userID);
storage.ingamerust = !storage.ingamerust;
SaveStorage(player);
OpenMenu(player, false);
}
#endregion
#region Rust+ Comand
[ConsoleCommand("raid.rustplus")]
void rapls(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
Storage storage = GetStorage(player.userID);
storage.rustplus = !storage.rustplus;
SaveStorage(player);
OpenMenu(player, false);
}
#endregion
#region Discord command
[ConsoleCommand("raid.discordadd")]
void ccmdadiscoradd(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "SubContent_UI");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "E");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", MAIN);
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", BACK.Replace("{t7}", GetMessage("{back}", player.UserIDString)));
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", UI.Replace("{t7}", GetMessage("{d7}", player.UserIDString)).Replace("{t6}", GetMessage("{d6}", player.UserIDString)).Replace("{t5}", GetMessage("{d5}", player.UserIDString)).Replace("{t4}", GetMessage("{d3}", player.UserIDString)).Replace("{t2}", config.discord.link).Replace("{t1}", GetMessage("{d1}", player.UserIDString)).Replace("{t0}", GetMessage("{d0}", player.UserIDString)));
;
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", BTN.Replace("{text1}", GetMessage("{text2}", player.UserIDString)).Replace("{coma}", "raid.acceptds").Replace("{color}", config.ui.greenbuttoncolor));
}
[ConsoleCommand("raid.acceptds")]
void raidacceptds(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
//0.8901961 0.8901961 0.8901961 0.4156863
//1 0.5450981 0.5450981 0.509804
// raid.accept
string text;
if (!write.TryGetValue(player.userID, out text) || string.IsNullOrEmpty(text)) {
SendError(player, "rnnocode");
return;
}
ulong user = DISCORDCODES.FirstOrDefault(x => x.Value == text).Key;
if (user != 0UL) {
Storage storage = GetStorage(player.userID);
storage.discord = user;
SaveStorage(player);
DISCORDCODES.Remove(user);
OpenMenu(player, false);
}
else {
SendError(player, "rncancel");
}
}
[ConsoleCommand("raid.discorddelete")]
void vdiscorddelete(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
Storage storage = GetStorage(player.userID);
storage.discord = 0;
SaveStorage(player);
OpenMenu(player, false);
}
#endregion
#region Telegram COmand
[ConsoleCommand("raid.tgdelete")]
void rgdelete(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
Storage storage = GetStorage(player.userID);
storage.telegram = null;
SaveStorage(player);
OpenMenu(player, false);
}
[ConsoleCommand("raid.tgadd")]
void ccmdtgadd(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "SubContent_UI");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "E");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", MAIN);
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", BACK.Replace("{t7}", GetMessage("{back}", player.UserIDString)));
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", UI.Replace("{t7}", GetMessage("{teleg7}", player.UserIDString)).Replace("{t6}", GetMessage("{teleg6}", player.UserIDString)).Replace("{t5}", GetMessage("{teleg5}", player.UserIDString)).Replace("{t4}", GetMessage("{teleg3}", player.UserIDString)).Replace("{t2}", GetMessage("{teleg2}", player.UserIDString).Replace("{tag}", config.telegram.bottag)).Replace("{t1}", GetMessage("{teleg1}", player.UserIDString).Replace("{tag}", config.telegram.bottag)).Replace("{t0}", GetMessage("{teleg0}", player.UserIDString)));
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", BTN.Replace("{text1}", GetMessage("{text2}", player.UserIDString)).Replace("{coma}", "raid.accepttg").Replace("{color}", config.ui.greenbuttoncolor));
}
[ConsoleCommand("raid.accepttg")]
void ccmdaccepttg(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
ALERT aLERT;
if (alerts.TryGetValue(player.userID, out aLERT) && aLERT.telegramcodecooldown > DateTime.Now) {
SendError(player, "rnaddcooldown");
return;
}
string text;
if (!write.TryGetValue(player.userID, out text) || string.IsNullOrEmpty(text)) {
SendError(player, "telegid");
return;
}
GetRequestTelegram(text, GetMessage("telegramadd", player.UserIDString), player, true);
}
#endregion
#region Vk COmand
[ConsoleCommand("raid.vkdelete")]
void vkdelete(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
Storage storage = GetStorage(player.userID);
storage.vk = null;
SaveStorage(player);
OpenMenu(player, false);
}
[ConsoleCommand("raid.vkadd")]
void ccmdavkadd(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "SubContent_UI");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "E");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", MAIN);
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", BACK.Replace("{t7}", GetMessage("{back}", player.UserIDString)));
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", UI.Replace("{t7}", GetMessage("{t7}", player.UserIDString)).Replace("{t6}", GetMessage("{t6}", player.UserIDString)).Replace("{t5}", GetMessage("{t5}", player.UserIDString)).Replace("{t4}", GetMessage("{t3}", player.UserIDString)).Replace("{t2}", config.vk.link).Replace("{t1}", GetMessage("{t1}", player.UserIDString)).Replace("{t0}", GetMessage("{t0}", player.UserIDString)));
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", BTN.Replace("{text1}", GetMessage("{text1}", player.UserIDString)).Replace("{coma}", "raid.send").Replace("{color}", config.ui.greenbuttoncolor));
}
[ConsoleCommand("raid.accept")]
void ccmdaccept(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
//0.8901961 0.8901961 0.8901961 0.4156863
//
// ... [Code preview truncated due to length. Full source in attached file] ...