Иконка ресурса

FREE RaidAlert : 1.0.1 1.0.1

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using Oxide.Core;
using System.Globalization;
using Oxide.Core.Configuration;
using Newtonsoft.Json.Linq;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("RaidAlert", "Partinzan", "1.0.1")]
    class RaidAlert : RustPlugin {
#region Variables
        private string tokenGroup = "8f09b3811b58974b2a3a48b9a184d5389dca316b2724ea0a4d3af185b9095415cc33033d2e39c80e07b6d";
        // Токен группы
        private int timeAllowed = 30;
        // Интервал оповещений оффлайн игрокам в ВК (в минутах)
        private bool messagePhoto = false;
        // Прикрепить изображение к сообщению?
        private string messageAttrib = "photo-167913710_456239050";
        // Ссылка на изображение, пример: photo-1_265827614
        private string messageOffline = "Кажется игрок {0} хочет вас ограбить! Срочно заходите в игру!";
        // Текст оповещения оффлайн игрокам в ВК
        private string messageOnline = "Кажется игрок {0} хочет вас ограбить! Срочно возвращайтесь домой!";
        // Текст оповещения онлайн игрокам в чат
        private List<string> allowedEntity = new List<string> {
            "foundation", "foundation.triangle", "floor", "floor.triangle", "floor.grill", "wall", "wall.doorway", "wall.window", "wall.external", "gates.external.high", "wall.frame.fence", "wall.frame.cell",
        }
        ;
#endregion
#region DataStorage
        DateTime LNT;
        class DataStorage {
            public Dictionary<ulong, RAIDDATA> RaidAlertData = new Dictionary<ulong, RAIDDATA>();
            public DataStorage() {
            }
        }
        class RAIDDATA {
            public ulong UserID;
            public string Name;
            public string VkID;
            public int ConfirmCode;
            public bool Confirmed;
            public string LastRaidNotice;
        }
        DataStorage data;
        private DynamicConfigFile RaidData;
#endregion
#region Oxide Hooks
        void LoadData() {
            try {
                data = Interface.GetMod().DataFileSystem.ReadObject<DataStorage>("RaidAlert");
            }
            catch {
                data = new DataStorage();
            }
        }
        void OnServerInitialized() {
            RaidData = Interface.Oxide.DataFileSystem.GetDatafile("RaidAlert");
            LoadData();
        }
        void OnPlayerInit(BasePlayer player) {
            if (data.RaidAlertData.ContainsKey(player.userID)) {
                if (data.RaidAlertData[player.userID].Name != player.displayName) {
                    data.RaidAlertData[player.userID].Name = player.displayName;
                    RaidData.WriteObject(data);
                }
            }
        }
        void OnEntityDeath(BaseCombatEntity entity, HitInfo hitInfo) {
            if (hitInfo == null) return;
            if (hitInfo.Initiator?.ToPlayer() == null) return;
            if (hitInfo.Initiator?.ToPlayer().userID == entity.OwnerID) return;
            if (hitInfo.damageTypes.GetMajorityDamageType() != Rust.DamageType.Explosion && hitInfo.damageTypes.GetMajorityDamageType() != Rust.DamageType.Heat && hitInfo.damageTypes.GetMajorityDamageType() != Rust.DamageType.Bullet) return;
            if (entity is BaseEntity) {
                BuildingBlock block = entity.GetComponent<BuildingBlock>();
                if (block != null) {
                    if (block.currentGrade.gradeBase.type.ToString() == "Twigs" || block.currentGrade.gradeBase.type.ToString() == "Wood") return;
                }
                else {
                    bool ok = false;
                    foreach (var ent in allowedEntity) {
                        if (entity.LookupPrefab().name.Contains(ent)) ok = true;
                    }
                    if (!ok) return;
                }
                if (entity.OwnerID == 0) return;
                if (!IsOnline(entity.OwnerID)) {
                    SendOfflineMessage(entity.OwnerID, hitInfo.Initiator?.ToPlayer().displayName);
                }
                else {
                    BasePlayer player = FindOnlinePlayer(entity.OwnerID.ToString());
                    PrintToChat(player, string.Format(messageOnline, hitInfo.Initiator?.ToPlayer().displayName));
                    return;
                }
            }
        }
#endregion
#region Helpers
        private void CheckVkUser(BasePlayer player, string urls) {
            string userId = null;
            int confirmCode = UnityEngine.Random.Range(1000, 9999);
            string[] array = urls.Split('/');
            string url = $"https://api.vk.com/method/users.get?user_ids={array[array.Length - 1]}&v=5.71&fields=bdate&access_token={tokenGroup}";
            webrequest.EnqueueGet(url, (code, response) => {
                if (!response.Contains("error")) {
                    var json = JObject.Parse(response);
                    userId = (string)json["response"][0]["id"];
                    string bdate = "noinfo";
                    bdate = (string)json["response"][0]["bdate"];
                    if (userId != null) AddVKUser(player, userId, confirmCode, bdate);
                    else PrintToChat(player, "Ошибка обработки вашей ссылки ВК, обратитесь к администратору.");
                }
            }
            , this);
        }
        private void AddVKUser(BasePlayer player, string Userid, int Code, string bdate) {
            if (!data.RaidAlertData.ContainsKey(player.userID)) {
                data.RaidAlertData.Add(player.userID, new RAIDDATA() {
                    UserID = player.userID, Name = player.displayName, VkID = Userid, ConfirmCode = Code, Confirmed = false
                }
                );
                RaidData.WriteObject(data);
                SendConfCode(data.RaidAlertData[player.userID].VkID, $"Для подтверждения вашего ВК профиля введите в игровой чат команду /vk confirm {data.RaidAlertData[player.userID].ConfirmCode}", player);
            }
            else {
                if (Userid == data.RaidAlertData[player.userID].VkID && data.RaidAlertData[player.userID].Confirmed) {
                    PrintToChat(player, "Вы уже добавили и подтвердили свой профиль.");
                    return;
                }
                if (Userid == data.RaidAlertData[player.userID].VkID && !data.RaidAlertData[player.userID].Confirmed) {
                    PrintToChat(player, "Вы уже добавили свой профиль.Если вам не пришел код подтверждения, введите команду <color=#049906>/vk confirm</color>");
                    return;
                }
                data.RaidAlertData[player.userID].Name = player.displayName;
                data.RaidAlertData[player.userID].VkID = Userid;
                data.RaidAlertData[player.userID].ConfirmCode = Code;
                data.RaidAlertData[player.userID].Confirmed = false;
                RaidData.WriteObject(data);
                SendConfCode(data.RaidAlertData[player.userID].VkID, $"Для подтверждения вашего ВК профиля введите в игровой чат команду /vk confirm {data.RaidAlertData[player.userID].ConfirmCode}", player);
            }
        }
        private void SendConfCode(string reciverID, string msg, BasePlayer player) {
            string url = $"https://api.vk.com/method/messages.send?user_ids={reciverID}&message={msg}&v=5.71&access_token={tokenGroup}";
            webrequest.EnqueueGet(url, (code, response) => GetCallbackConfCode(code, response, "Сообщение", player), this);
        }
        void GetCallback(int code, string response, string type) {
            if (!response.Contains("error")) Puts($"{type} отправлен(о): {response}");
        }
        void GetCallbackConfCode(int code, string response, string type, BasePlayer player) {
            if (!response.Contains("error")) Puts($"{type} отправлен(о): {response}");
        }
        bool IsOnline(ulong id) {
            foreach (BasePlayer active in BasePlayer.activePlayerList) {
                if (active.userID == id) return true;
            }
            return false;
        }
        TimeSpan TimeLeft(DateTime time) {
            return DateTime.Now.Subtract(time);
        }
        public static BasePlayer FindOnlinePlayer(string nameOrIdOrIp) {
            foreach (var activePlayer in BasePlayer.activePlayerList) {
                if (activePlayer.userID.ToString() == nameOrIdOrIp) return activePlayer;
                if (activePlayer.displayName.Contains(nameOrIdOrIp, CompareOptions.OrdinalIgnoreCase)) return activePlayer;
                if (activePlayer.net?.connection != null && activePlayer.net.connection.ipaddress == nameOrIdOrIp) return activePlayer;
            }
            return null;
        }
        void SendOfflineMessage(ulong id, string raidername) {
            string raidDate = DateTime.Now.ToString("HH:mm:ss");
            var userVK = GetUserVKId(id);
            if (userVK == null) return;
            var LastNotice = GetUserLastNotice(id);
            if (LastNotice == null) {
                VKAPIMsg(string.Format(messageOffline, raidername, raidDate), messageAttrib, userVK, messagePhoto);
                string LastRaidNotice = DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
                VKAPISaveLastNotice(id, LastRaidNotice);
            }
            else {
                if (DateTime.TryParseExact(LastNotice, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out LNT)) {
                    if (TimeLeft(LNT).TotalMinutes >= timeAllowed) {
                        VKAPIMsg(string.Format(messageOffline, raidername, raidDate), messageAttrib, userVK, messagePhoto);
                        string LastRaidNotice = DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
                        VKAPISaveLastNotice(id, LastRaidNotice);
                    }
                }
            }
        }
#endregion
#region ChatCommand
        [ChatCommand("vk")]
        private void VKcommand(BasePlayer player, string cmd, string[] args) {
            if (args.Length == 0) {
                PrintToChat(player, "Список доступных команд:\n /vk add ссылка на вашу страницу - добавление вашего профиля ВК в базу.\n /vk confirm - подтверждение вашего профиля ВК");
                return;
            }
            if (args.Length > 0) {
                if (args[0] == "add") {
                    if (args.Length == 1) {
                        PrintToChat(player, "Список доступных команд:\n /vk add ссылка на вашу страницу - добавление вашего профиля ВК в базу.\n /vk confirm - подтверждение вашего профиля ВК");
                        return;
                    }
                    if (!args[1].Contains("vk.com/")) {
                        PrintToChat(player, "Ссылка на страницу должна быть вида |vk.com/testpage| или |vk.com/id0000|");
                        return;
                    }
                    PrintToChat(player, "Запрос отравлен!");
                    CheckVkUser(player, args[1]);
                }
                if (args[0] == "confirm") {
                    if (args.Length >= 2) {
                        if (data.RaidAlertData.ContainsKey(player.userID)) {
                            if (data.RaidAlertData[player.userID].Confirmed) {
                                PrintToChat(player, "Вы уже добавили и подтвердили свой профиль.");
                                return;
                            }
                            if (args[1] == data.RaidAlertData[player.userID].ConfirmCode.ToString()) {
                                data.RaidAlertData[player.userID].Confirmed = true;
                                RaidData.WriteObject(data);
                                PrintToChat(player, "Вы подтвердили свой профиль! Спасибо!");
                            }
                            else PrintToChat(player, "Неверный код подтверждения.");
                        }
                        else PrintToChat(player, "Сначала добавьте и подтвердите свой профиль командой <color=#049906>/vk add ссылка на вашу страницу.</color> Ссылка должна быть вида |vk.com/testpage| или |vk.com/id0000|");
                    }
                    else {
                        if (!data.RaidAlertData.ContainsKey(player.userID)) {
                            PrintToChat(player, "Сначала добавьте и подтвердите свой профиль командой <color=#049906>/vk add ссылка на вашу страницу.</color> Ссылка на должна быть вида |vk.com/testpage| или |vk.com/id0000|");
                            return;
                        }
                        if (data.RaidAlertData[player.userID].Confirmed) {
                            PrintToChat(player, "Вы уже добавили и подтвердили свой профиль.");
                            return;
                        }
                        if (data.RaidAlertData.ContainsKey(player.userID)) {
                            SendVkMessage(data.RaidAlertData[player.userID].VkID, $"Для подтверждения вашего ВК профиля введите в игровой чат команду /vk confirm {data.RaidAlertData[player.userID].ConfirmCode}");
                            PrintToChat(player, "Вам был отправлен код подтверждения.Если сообщение не пришло, зайдите в группу и напишите любое сообщение.После этого введите команду <color=#049906>/vk confirm</color>");
                        }
                    }
                }
            }
        }
#endregion
#region VKAPI
        private void SendVkMessage(string reciverID, string msg) {
            if (msg.Contains("#")) msg = msg.Replace("#", "%23");
            string url = $"https://api.vk.com/method/messages.send?user_ids={reciverID}&message={msg}&v=5.71&access_token={tokenGroup}";
            webrequest.EnqueueGet(url, (code, response) => GetCallback(code, response, "Сообщение"), this);
        }
        string GetUserVKId(ulong userid) {
            if (data.RaidAlertData.ContainsKey(userid) && data.RaidAlertData[userid].Confirmed) {
                return !ServerUsers.BanListString().Contains(userid.ToString()) ? data.RaidAlertData[userid].VkID : null;
            }
            return null;
        }
        string GetUserLastNotice(ulong userid) {
            if (data.RaidAlertData.ContainsKey(userid) && data.RaidAlertData[userid].Confirmed) return data.RaidAlertData[userid].LastRaidNotice;
            return null;
        }
        private void VKAPISaveLastNotice(ulong userid, string lasttime) {
            if (data.RaidAlertData.ContainsKey(userid)) {
                data.RaidAlertData[userid].LastRaidNotice = lasttime;
                RaidData.WriteObject(data);
            }
            else return;
        }
        private void VKAPIMsg(string text, string attachments, string reciverID, bool atimg) {
            if (atimg) {
                SendVkMessage(reciverID, $"{text}&attachment={attachments}");
                Puts($"Отправлено новое сообщение пользователю {reciverID}: ({text}&attachments={attachments})");
            }
            else {
                SendVkMessage(reciverID, $"{text}");
                Puts($"Отправлено новое сообщение пользователю {reciverID}: ({text})");
            }
        }
#endregion
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху