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

FREE PromoCode : 1.2.0 1.2.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6

using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;

namespace Oxide.Plugins
{
    [Info("PromoCode", "Barry_Allenn", "1.2.0")]
    [Description("Plugin for promo codes with an interface for entering and activating promo codes")]

    public class PromoCode : RustPlugin
    {
        [PluginReference]
        private Plugin ImageLibrary;

        private PluginConfig config;
        private Dictionary<string, int> promoCodeActivations = new Dictionary<string, int>();
        private Dictionary<string, List<string>> usedPromoCodesByPlayer = new Dictionary<string, List<string>>();

        private class PluginConfig
        {

            [JsonProperty("PromoCodes")]
            public Dictionary<string, PromoCodeData> PromoCodes { get; set; }

            [JsonProperty("QR code to join your Discord server")]
            public string QRDISCORD_BA = "https://i.ibb.co/Zd1XKwh/Untitled-3.png";

            [JsonProperty("Text in the first column")] public string textFPDEText = "Discord";

            [JsonProperty("Text in the second column")] public string texttkFPDEText = "TikTok";

            [JsonProperty("Link to the first column")] public string DSFPDEText = "https://discord.gg/qXkHDGPkmn";

            [JsonProperty("Link to the second column")] public string TKFPDEText = "https://www.tiktok.com/@freedom.ua.rust";

            [JsonProperty("QR code of your TikTok profile")]
            public string QRTITTTOK_BA = "https://i.ibb.co/K7pH2jH/Untitled-2.png";

            [JsonProperty("MessagePrefix")]
            public string MessagePrefix { get; set; } = "<color=#0057b8>[Your Prefix]</color> ";

            [JsonProperty("Webhook to send to discord")]
            public string DiscordWebhookUrl { get; set; } = "Enter_your_webhook_URL_here";

            [JsonProperty("true or false sending promo code messages to the global chat")]
            public bool EnablePromoCodeBroadcast { get; set; } = true;
            
        }

        

        private class PromoCodeData
        {
            public string RewardCommand { get; set; }
            public string ExpiryDate { get; set; }
            public int MaxActivations { get; set; } = 50;
        }

        protected override void LoadDefaultConfig()
        {
            Config.WriteObject(new PluginConfig
            {
                EnablePromoCodeBroadcast = true,

                DiscordWebhookUrl = "Enter_your_webhook_URL_here",

                PromoCodes = new Dictionary<string, PromoCodeData>
                {
                    { "WELCOME", new PromoCodeData { RewardCommand = "give {player} wood 1000", ExpiryDate = "2024-12-31", MaxActivations = 50 } },
                    { "BONUS", new PromoCodeData { RewardCommand = "give {player} stone 500", ExpiryDate = "2024-12-31", MaxActivations = 50 } }
                },

                MessagePrefix = "<color=#0057b8>[Your Prefix]</color> ",

            }, true);
        }

        private void SendPluginMessage(BasePlayer player, string messageKey, params object[] args)
        {
            string prefix = config.MessagePrefix;
            string message = string.Format(Msg(messageKey, player.UserIDString), args);
            SendReply(player, $"{prefix}{message}");
        }

        private Dictionary<string, string> tempPromoCodeNames = new Dictionary<string, string>();
        private Dictionary<string, string> tempPromoCodeCommands = new Dictionary<string, string>();
        private Dictionary<string, int> tempPromoCodeLimits = new Dictionary<string, int>();
        private Dictionary<string, string> tempPromoCodeDates = new Dictionary<string, string>();


        private void Init()
        {
            PrintWarning("\n-----------------------------\n" +
            "     Author - Barry_Allenn\n" +
            "     Discord - https://discord.gg/qXkHDGPkmn\n" +
            "-----------------------------");

            permission.RegisterPermission("promocode.adminpanel", this);
            config = Config.ReadObject<PluginConfig>();
            LoadData();
        }

        private void Unload()
        {
            SaveData();
        }

        private void LoadData()
        {

            usedPromoCodesByPlayer = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, List<string>>>(Name) ?? new Dictionary<string, List<string>>();


            promoCodeActivations = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, int>>(Name + "_Activations") ?? new Dictionary<string, int>();
        }

        private void SaveData()
        {

            Interface.Oxide.DataFileSystem.WriteObject(Name, usedPromoCodesByPlayer);


            Interface.Oxide.DataFileSystem.WriteObject(Name + "_Activations", promoCodeActivations);
        }

        void OnServerInitialized()
        {
            ImageLibrary.Call("AddImage", "https://i.ibb.co/vz4YqSP/image.png", "fonpromocode");
            ImageLibrary.Call("AddImage", "https://i.ibb.co/1fhWtL4/adminpanel.png", "fonadminpanel");
            ImageLibrary.Call("AddImage", "https://i.ibb.co/j5GpWm2/1.png", "S_back");
            ImageLibrary.Call("AddImage", "https://i.ibb.co/nswvsyf/1.png", "S_before");
            ImageLibrary.Call("AddImage", "https://i.ibb.co/b1ws1ZS/1.png", "admin_button");
            ImageLibrary.Call("AddImage", "https://i.ibb.co/JKrzSFM/image.png", "Ojdwnfwf");
            ImageLibrary.Call("AddImage", config.QRTITTTOK_BA, "QRTITTTOK_BA");
            ImageLibrary.Call("AddImage", config.QRDISCORD_BA, "QRDISCORD_BA");
        }

        [ChatCommand("promo")]
        private void ShowPromoCodeMenu(BasePlayer player, string command, string[] args)
        {
            ShowPromoCodeUI_V1(player);
        }

        [ChatCommand("open_ui2")]
        private void OpenUI2ChatCommand(BasePlayer player, string command, string[] args)
        {
            CuiHelper.DestroyUi(player, "PromoCodeMenuUI");
            ShowPromoCodeUI_V2(player);
        }

        private void ShowPromoCodeUI_V1(BasePlayer player)
        {

            CuiHelper.DestroyUi(player, "PromoCodeMenu");

            var elements = new CuiElementContainer();


            elements.Add(new CuiPanel
            {
                Image = { Color = "0.1 0.1 0.1 0" },
                RectTransform = { AnchorMin = "0.23 0.19", AnchorMax = "0.77 0.75" },
                CursorEnabled = true
            }, "Overlay", "PromoCodeMenu");

            elements.Add(new CuiElement
            {
                Parent = "PromoCodeMenu",
                Components = {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "fonpromocode") },
                    new CuiRectTransformComponent { AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0" }
                }
            });

            elements.Add(new CuiElement
            {
                Parent = "PromoCodeMenu",
                Components = {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "QRTITTTOK_BA") },
                    new CuiRectTransformComponent { AnchorMin = "0.363 0.2555", AnchorMax = "0.514 0.533", OffsetMax = "0 0" }
                }
            });

            elements.Add(new CuiElement
            {
                Parent = "PromoCodeMenu",
                Components = {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "QRDISCORD_BA") },
                    new CuiRectTransformComponent { AnchorMin = "0.1034 0.2555", AnchorMax = "0.253 0.533", OffsetMax = "0 0" }
                }
            });

            elements.Add(new CuiElement
            {
                Parent = "PromoCodeMenu",
                Components = {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "Ojdwnfwf") },
                    new CuiRectTransformComponent { AnchorMin = "0.0954 0.247", AnchorMax = "0.261 0.5417", OffsetMax = "0 0" }
                }
            });

            elements.Add(new CuiElement
            {
                Parent = "PromoCodeMenu",
                Components = {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "Ojdwnfwf") },
                    new CuiRectTransformComponent { AnchorMin = "0.3555 0.247", AnchorMax = "0.5215 0.5417", OffsetMax = "0 0" }
                }
            });

            elements.Add(new CuiLabel
            {
                Text = { Text = Msg("EnterPromoCode", player.UserIDString), Color = "1.00 1.00 1.00 0.6", FontSize = 12, Align = TextAnchor.MiddleLeft },
                RectTransform = { AnchorMin = "0.117 0.745", AnchorMax = "0.354 0.81" }
            }, "PromoCodeMenu");

            elements.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.605 0.77", AnchorMax = "0.85 0.83" },
                Text = { Text = Msg("S_info", player.userID.ToString()), Color = "1.00 1.00 1.00 0.6", Align = TextAnchor.MiddleCenter, FontSize = 15 }
            }, "PromoCodeMenu");

            elements.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.595 0.65", AnchorMax = "0.91 0.7" },
                Text = { Text = Msg("S_infotllo_line_1", player.userID.ToString()), Color = "1.00 1.00 1.00 0.5", Align = TextAnchor.MiddleLeft, FontSize = 14 }
            }, "PromoCodeMenu");

            elements.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.595 0.58", AnchorMax = "0.91 0.63" },
                Text = { Text = Msg("S_infotllo_line_2", player.userID.ToString()), Color = "1.00 1.00 1.00 0.5", Align = TextAnchor.MiddleLeft, FontSize = 14 }
            }, "PromoCodeMenu");

            elements.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.595 0.5", AnchorMax = "0.91 0.55" },
                Text = { Text = Msg("S_infotllo_line_3", player.userID.ToString()), Color = "1.00 1.00 1.00 0.5", Align = TextAnchor.MiddleLeft, FontSize = 14 }
            }, "PromoCodeMenu");

            elements.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.595 0.43", AnchorMax = "0.91 0.48" },
                Text = { Text = Msg("S_infotllo_line_4", player.userID.ToString()), Color = "1.00 1.00 1.00 0.5", Align = TextAnchor.MiddleLeft, FontSize = 14 }
            }, "PromoCodeMenu");

            elements.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.595 0.36", AnchorMax = "0.91 0.41" },
                Text = { Text = Msg("S_infotllo_line_5", player.userID.ToString()), Color = "1.00 1.00 1.00 0.5", Align = TextAnchor.MiddleLeft, FontSize = 14 }
            }, "PromoCodeMenu");

            elements.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.125 0.185", AnchorMax = "0.23 0.225" },
                Text = { Text = config.textFPDEText, Color = "1.00 1.00 1.00 0.5", Align = TextAnchor.MiddleCenter, FontSize = 10 }
            }, "PromoCodeMenu");

            elements.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.385 0.185", AnchorMax = "0.49 0.225" },
                Text = { Text = config.texttkFPDEText, Color = "1.00 1.00 1.00 0.5", Align = TextAnchor.MiddleCenter, FontSize = 10 }
            }, "PromoCodeMenu");

            elements.Add(new CuiElement
            {
                Name = "PromoCodeInput",
                Parent = "PromoCodeMenu",
                Components = {
                    new CuiInputFieldComponent { Text = Msg("EnterPromoCodePlaceholder", player.UserIDString), Color = "1.00 1.00 1.00 0.6", 
                    FontSize = 13, Align = TextAnchor.MiddleLeft, Command = "promocode.submit", NeedsKeyboard = true },
                    new CuiRectTransformComponent { AnchorMin = "0.117 0.645", AnchorMax = "0.39 0.71" }
                }
            });

            elements.Add(new CuiPanel
            {
                RectTransform = { AnchorMin = "0.109 0.147", AnchorMax = "0.25 0.18", OffsetMax = "0 0" },
                Image = { Color = "1 1 1 0" }
            }, "PromoCodeMenu", "DSFPDEText");

            elements.Add(new CuiElement
            {
                Parent = "DSFPDEText",
                Components =
                {
                    new CuiInputFieldComponent { Text = config.DSFPDEText, Color = "1 1 1 0.3", Align = TextAnchor.MiddleLeft, FontSize = 9, Font = "robotocondensed-bold.ttf"},
                    new CuiRectTransformComponent { AnchorMin = "0 0", AnchorMax = "1 1" }
                }
            });

            elements.Add(new CuiPanel
            {
                RectTransform = { AnchorMin = "0.3685 0.147", AnchorMax = "0.509 0.18", OffsetMax = "0 0" },
                Image = { Color = "1 1 1 0" }
            }, "PromoCodeMenu", "TKFPDEText");

            elements.Add(new CuiElement
            {
                Parent = "TKFPDEText",
                Components =
                {
                    new CuiInputFieldComponent { Text = config.TKFPDEText, Color = "1 1 1 0.3", Align = TextAnchor.MiddleLeft, FontSize = 9, Font = "robotocondensed-bold.ttf"},
                    new CuiRectTransformComponent { AnchorMin = "0 0", AnchorMax = "1 1" }
                }
            });

            
            if (permission.UserHasPermission(player.UserIDString, "promocode.adminpanel"))
            {
                
                elements.Add(new CuiElement
                {
                   Parent = "PromoCodeMenu",
                    Components = 
                    {
                        new CuiRawImageComponent
                        {
                            Png = (string)ImageLibrary.Call("GetImage", "admin_button"),
                            Color = "1 1 1 1"
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = "0.575 0.17", AnchorMax = "0.878 0.24"
                        }
                    }
                });

               
               elements.Add(new CuiButton
                {
                    Button = { Color = "0 0 0 0", Command = "open_secondary_ui", FadeIn = 0.5f },
                    RectTransform = { AnchorMin = "0.575 0.17", AnchorMax = "0.878 0.24" },
                    Text = { Text = Msg("S_adminpanel", player.UserIDString), Color = "1.00 1.00 1.00 0.9", FontSize = 11, Align = TextAnchor.MiddleCenter }
                }, "PromoCodeMenu");
            }

            elements.Add(new CuiButton
            {
                Button = { Color = "0.2 0.8 0.2 0", Command = "promocode.submit", FadeIn = 0.5f },
                RectTransform = { AnchorMin = "0.405 0.645", AnchorMax = "0.4985 0.713" },
                Text = { Text = Msg("Activate", player.UserIDString), Color = "1.00 1.00 1.00 0.9", FontSize = 11, Align = TextAnchor.MiddleCenter }
            }, "PromoCodeMenu");

            elements.Add(new CuiButton
            {
                Button = { Color = "0.8 0.2 0.2 0", Command = "promocode.close", FadeIn = 0.5f },
                RectTransform = { AnchorMin = "0.97 0.952", AnchorMax = "0.995 0.99" },
                Text = { Text = Msg("Close", player.UserIDString), FontSize = 20, Align = TextAnchor.MiddleCenter }
            }, "PromoCodeMenu");

            CuiHelper.AddUi(player, elements);
        }

        private void ShowPromoCodeUI_V2(BasePlayer player, int page = 1)
        {
            

            const int itemsPerPage = 5; 
            var container = new CuiElementContainer();

           
            var panel = container.Add(new CuiPanel
            {
                Image = { Color = "0 0 0 0" },
                RectTransform = { AnchorMin = "0.3 0.25", AnchorMax = "0.7 0.69" },
                CursorEnabled = true
            }, "Overlay", "PromoCodeMenuUI");

            container.Add(new CuiElement
            {
                Parent = "PromoCodeMenuUI",
                Components = {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "fonadminpanel") },
                    new CuiRectTransformComponent { AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0" }
                }
            });

            
            container.Add(new CuiPanel
            {
                Image = { Color = "0.2 0.2 0.2 0" },
                RectTransform = { AnchorMin = "0.5 0.2", AnchorMax = "0.95 0.8" }
            }, panel);

            
            container.Add(new CuiButton
            {
                Button = { Color = "0.8 0.2 0.2 0", Command = "ui_close_secondary", Close = "PromoCodeMenuUI" },
                RectTransform = { AnchorMin = "0.95 0.95", AnchorMax = "0.98 0.989" },
                Text = { Text = "", FontSize = 16, Align = TextAnchor.MiddleCenter }
            }, panel);

            
        
            
            container.Add(new CuiLabel
            {
                Text = {
                    Text = Msg("S_panelpromo", player.userID.ToString()),
                    Color = "1 1 1 0.6",
                    FontSize = 11,
                    Align = TextAnchor.MiddleCenter
                },
                RectTransform = { AnchorMin = "0.61 0.785", AnchorMax = "0.87 0.85" }
            }, panel);

           
            var promoCodes = new List<KeyValuePair<string, PromoCodeData>>(config.PromoCodes);
            int totalPages = Mathf.CeilToInt((float)promoCodes.Count / itemsPerPage);
            int start = (page - 1) * itemsPerPage;

            float y = 0.7f;
            for (int i = start; i < start + itemsPerPage && i < promoCodes.Count; i++)
            {
                var promoCode = promoCodes[i];
                string code = promoCode.Key;
                var data = promoCode.Value;

                int activations = promoCodeActivations.TryGetValue(code, out int count) ? count : 0;

                container.Add(new CuiLabel
                {
                    Text = {
                        Text = $"{code} ({string.Format(lang.GetMessage("Activations", this, player.UserIDString), activations, data.MaxActivations)})",
                        Color = "1 1 1 0.6",
                        FontSize = 8,
                        Align = TextAnchor.MiddleLeft
                    },
                    RectTransform = { AnchorMin = $"0.58 {y}", AnchorMax = $"0.9 {y + 0.05}" }
                }, panel);

                if (!string.IsNullOrEmpty(data.ExpiryDate))
                {
                    container.Add(new CuiLabel
                    {
                        Text = {
                           Text = string.Format(lang.GetMessage("ExpiryDate", this, player.UserIDString), data.ExpiryDate),
                            Color = "1 1 1 0.6",
                            FontSize = 8,
                            Align = TextAnchor.MiddleLeft
                        },
                        RectTransform = { AnchorMin = $"0.58 {y - 0.04}", AnchorMax = $"0.9 {y + 0.01}" }
                    }, panel);
                }


                if (permission.UserHasPermission(player.UserIDString, "promocode.adminpanel"))
                {
                    container.Add(new CuiButton
                    {
                        Button = {
                           Color = "0.8 0.2 0.2 0",
                            Command = $"promocode.remove {code}",
                            FadeIn = 0.5f
                        },
                        RectTransform = { AnchorMin = $"0.82 {y - 0.02}", AnchorMax = $"0.9 {y + 0.03}" },
                        Text = { Text = Msg("S_delete", player.UserIDString), Color = "1 1 1 0.6", FontSize = 10, Align = TextAnchor.MiddleCenter }
                    }, panel);
                }
        
                y -= 0.1f;
            }


            if (page < totalPages)
            {

                container.Add(new CuiElement
               {
                    Parent = panel,
                    Components =
                    {
                        new CuiRawImageComponent
                        {
                            Png = (string)ImageLibrary.Call("GetImage", "S_before"),
                            Color = "1 1 1 1"
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = "0.82 0.14",
                            AnchorMax = "0.875 0.2"
                        }
                    }
                });


               container.Add(new CuiButton
                {
                    Button = { Color = "0 0 0 0", Command = $"ui_promo_page {page + 1}", FadeIn = 0.5f },
                    RectTransform = { AnchorMin = "0.82 0.14", AnchorMax = "0.875 0.2" },
                    Text = { Text = "", FontSize = 9, Align = TextAnchor.MiddleCenter }
                }, panel);
            }


            if (page > 1)
            {

                container.Add(new CuiElement
                {
                    Parent = panel,
                    Components =
                    {
                        new CuiRawImageComponent
                        {
                            Png = (string)ImageLibrary.Call("GetImage", "S_back"),
                            Color = "1 1 1 1" 
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = "0.61 0.14",
                            AnchorMax = "0.665 0.2"
                        }
                    }
                });


                container.Add(new CuiButton
                {
                    Button = { Color = "0 0 0 0", Command = $"ui_promo_page {page - 1}", FadeIn = 0.5f },
                    RectTransform = { AnchorMin = "0.61 0.14", AnchorMax = "0.665 0.2" },
                    Text = { Text = "", FontSize = 8, Align = TextAnchor.MiddleCenter }
                }, panel);
            }

            container.Add(new CuiElement
            {
                Name = "PromoCodeNameInput",
                Parent = panel,
                Components = {
                    new CuiInputFieldComponent
                    {
                        Text = "",
                        Color = "1 1 1 0.6",
                        FontSize = 9,
                        Align = TextAnchor.MiddleLeft,
                        Command = "promocode.setname",
                        NeedsKeyboard = true
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.135 0.725",
                        AnchorMax = "0.33 0.778"
                    }
                }
            });

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.125 0.835", AnchorMax = "0.41 0.874" },
                Text = { Text = Msg("S_VDR", player.userID.ToString()), Color = "1.00 1.00 1.00 0.4", Align = TextAnchor.MiddleLeft, FontSize = 9 }
            }, "PromoCodeMenuUI");

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.125 0.79", AnchorMax = "0.41 0.83" },
                Text = { Text = Msg("S_VDRPR", player.userID.ToString()), Color = "1.00 1.00 1.00 0.2", Align = TextAnchor.MiddleLeft, FontSize = 8 }
            }, "PromoCodeMenuUI");


            container.Add(new CuiElement
            {
                Name = "PromoCodeCommandInput",
                Parent = panel,
                Components = {
                    new CuiInputFieldComponent
                    {
                        Text = "",
                        Color = "1 1 1 0.6",
                        FontSize = 9,
                        Align = TextAnchor.MiddleLeft,
                        Command = "promocode.setcommand",
                        NeedsKeyboard = true
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.135 0.49",
                        AnchorMax = "0.33 0.538"
                    }
                }
            });

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.125 0.595", AnchorMax = "0.41 0.64" },
                Text = { Text = Msg("S_CODR", player.userID.ToString()), Color = "1.00 1.00 1.00 0.4", Align = TextAnchor.MiddleLeft, FontSize = 9 }
            }, "PromoCodeMenuUI");

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.125 0.555", AnchorMax = "0.41 0.6" },
                Text = { Text = Msg("S_CODRPR", player.userID.ToString()), Color = "1.00 1.00 1.00 0.2", Align = TextAnchor.MiddleLeft, FontSize = 8 }
            }, "PromoCodeMenuUI");

            

            container.Add(new CuiElement
            {
                Name = "PromoCodeLimitInput",
                Parent = panel,
                Components = {
                    new CuiInputFieldComponent
                   {
                        Text = "",
                        Color = "1 1 1 1",
                        FontSize = 9,
                        Align = TextAnchor.MiddleLeft,
                        Command = "promocode.setlimit",
                        NeedsKeyboard = true
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.3 0.255", 
                        AnchorMax = "0.37 0.3" 
                    }
                }
            });

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.28 0.355", AnchorMax = "0.41 0.4" },
                Text = { Text = Msg("S_CODRLIMIT", player.userID.ToString()), Color = "1.00 1.00 1.00 0.4", Align = TextAnchor.MiddleLeft, FontSize = 9 }
            }, "PromoCodeMenuUI");

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.28 0.315", AnchorMax = "0.41 0.355" },
                Text = { Text = Msg("S_CODRLIMFFIT", player.userID.ToString()), Color = "1.00 1.00 1.00 0.2", Align = TextAnchor.MiddleLeft, FontSize = 8 }
            }, "PromoCodeMenuUI");

            container.Add(new CuiElement
            {
                Name = "PromoCodeExpiryDateInput",
                Parent = panel,
                Components = {
                    new CuiInputFieldComponent
                    {
                        Text = "",
                        Color = "1 1 1 0.6",
                        FontSize = 9,
                        Align = TextAnchor.MiddleLeft,
                        Command = "promocode.setdate",
                        NeedsKeyboard = true
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.135 0.255", 
                        AnchorMax = "0.235 0.3"
                    }
                }
            });

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.125 0.355", AnchorMax = "0.27 0.4" },
                Text = { Text = Msg("S_CODRdata", player.userID.ToString()), Color = "1.00 1.00 1.00 0.4", Align = TextAnchor.MiddleLeft, FontSize = 9 }
            }, "PromoCodeMenuUI");

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.125 0.315", AnchorMax = "0.27 0.355" },
                Text = { Text = Msg("S_CODRFFdata", player.userID.ToString()), Color = "1.00 1.00 1.00 0.2", Align = TextAnchor.MiddleLeft, FontSize = 8 }
            }, "PromoCodeMenuUI");


            container.Add(new CuiButton
            {
                Button = {
                    Color = "0.2 0.8 0.2 0",
                    Command = "promocode.create",
                    FadeIn = 0.5f
                },
                RectTransform = {
                    AnchorMin = "0.21 0.12", 
                    AnchorMax = "0.41 0.18" 
                },
                Text = {
                    Text = "Создать промокод",
                    FontSize = 14,
                    Align = TextAnchor.MiddleCenter,
                    Color = "1 1 1 1"
                }
            }, panel);

            CuiHelper.AddUi(player, container);
            
        }


        [ConsoleCommand("promocode.setlimit")]
        private void SetPromoCodeLimit(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null || arg.Args == null || arg.Args.Length < 1) return;


            if (int.TryParse(arg.Args[0], out int limit) && limit > 0)
            {

                tempPromoCodeLimits[player.UserIDString] = limit;
                player.ChatMessage(lang.GetMessage("LimitSaved", this, player.UserIDString).Replace("{limit}", limit.ToString()));
            }
            else
            {
                player.ChatMessage(lang.GetMessage("LimitError", this, player.UserIDString));
            }
        }


        [ConsoleCommand("promocode.setname")]
        private void SetPromoCodeName(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null || arg.Args == null || arg.Args.Length < 1) return;
        
            string promoCodeName = string.Join(" ", arg.Args).Trim(); 
        
           if (string.IsNullOrEmpty(promoCodeName))
            {
                player.ChatMessage(lang.GetMessage("PromoCodeNameEmpty", this, player.UserIDString));
                return;
            }


            tempPromoCodeNames[player.UserIDString] = promoCodeName;
            player.ChatMessage(lang.GetMessage("PromoCodeNameSaved", this, player.UserIDString).Replace("{promoCodeName}", promoCodeName));
        }


        [ConsoleCommand("promocode.submit")]
        private void SubmitPromoCode(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null || arg.Args == null || arg.Args.Length < 1) return;

            string promoCode = arg.Args[0].Trim();
            ActivatePromoCode(player, promoCode); 
        }





        [ConsoleCommand("promocode.setcommand")]
        private void SetPromoCodeCommand(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null || arg.Args == null || arg.Args.Length == 0) return;


            string promoCodeCommand = string.Join(" ", arg.Args).Trim();


            tempPromoCodeCommands[player.UserIDString] = promoCodeCommand;
            player.ChatMessage(lang.GetMessage("PromoCodeCommandSaved", this, player.UserIDString).Replace("{promoCodeCommand}", promoCodeCommand));
        }


        [ConsoleCommand("promocode.setdate")]
        private void SetPromoCodeDate(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null || arg.Args == null || arg.Args.Length < 1) return;

            string dateInput = arg.Args[0].Trim();


            if (DateTime.TryParse(dateInput, out DateTime expiryDate))
            {
                tempPromoCodeDates[player.UserIDString] = expiryDate.ToString("yyyy-MM-dd");
                player.ChatMessage(lang.GetMessage("PromoCodeDateSaved", this, player.UserIDString).Replace("{expiryDate}", expiryDate.ToString("yyyy-MM-dd")));
            }
            else
            {
                player.ChatMessage(lang.GetMessage("PromoCodeDateError", this, player.UserIDString));
            }
        }





        [ConsoleCommand("promocode.create")]
        private void CreatePromoCode(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null) return;


            tempPromoCodeNames.TryGetValue(player.UserIDString, out string promoCodeName);
            tempPromoCodeCommands.TryGetValue(player.UserIDString, out string promoCodeCommand);
            tempPromoCodeLimits.TryGetValue(player.UserIDString, out int promoCodeLimit);
            tempPromoCodeDates.TryGetValue(player.UserIDString, out string promoCodeExpiryDate);


            if (string.IsNullOrEmpty(promoCodeName))
            {
                string errorMessage = lang.GetMessage("PromoCodeNameEmpty", this, player.UserIDString);
                player.ChatMessage(errorMessage);
                return;
           }


            if (string.IsNullOrEmpty(promoCodeCommand))
            {
                string errorMessage = lang.GetMessage("PromoCodeCommandEmpty", this, player.UserIDString);
                player.ChatMessage(errorMessage);
                return;
           }


            if (promoCodeLimit <= 0)
            {
                string errorMessage = lang.GetMessage("PromoCodeLimitInvalid", this, player.UserIDString);
                player.ChatMessage(errorMessage);
                return;
            }


            if (string.IsNullOrEmpty(promoCodeExpiryDate))
            {
                string errorMessage = lang.GetMessage("PromoCodeExpiryDateEmpty", this, player.UserIDString);
                player.ChatMessage(errorMessage);
                return;
           }


            if (!config.PromoCodes.ContainsKey(promoCodeName))
            {
                config.PromoCodes.Add(promoCodeName, new PromoCodeData
                {
                    RewardCommand = promoCodeCommand,
                    ExpiryDate = promoCodeExpiryDate,
                    MaxActivations = promoCodeLimit
                });

                Config.WriteObject(config); 
                player.ChatMessage(lang.GetMessage("PromoCodeCreated", this, player.UserIDString).Replace("{promoCodeName}", promoCodeName).Replace("{promoCodeExpiryDate}", promoCodeExpiryDate));
        

                tempPromoCodeNames.Remove(player.UserIDString);
                tempPromoCodeCommands.Remove(player.UserIDString);
                tempPromoCodeLimits.Remove(player.UserIDString);
                tempPromoCodeDates.Remove(player.UserIDString);
            }
            else
            {
                player.ChatMessage(lang.GetMessage("PromoCodeExists", this, player.UserIDString).Replace("{promoCodeName}", promoCodeName));
            }
        }


        [ConsoleCommand("ui_promo_page")]
        private void ShowPromoCodePage(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null || arg.Args == null || arg.Args.Length < 1) return;

            if (!int.TryParse(arg.Args[0], out int page)) return;

    
            CuiHelper.DestroyUi(player, "PromoCodeMenuUI");


            ShowPromoCodeUI_V2(player, page);
        }


        [ConsoleCommand("promocode.close")]
        private void ClosePromoCodeUI(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null) return;

            CloseAllInterfaces(player);
            
        }

        [ConsoleCommand("open_secondary_ui")]
        private void OpenSecondaryUICommand(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null)
            {
                PrintError(lang.GetMessage("CommandPlayerOnly", this)); 
                return;
            }

            CuiHelper.DestroyUi(player, "PromoCodeMenuUI"); 
            ShowPromoCodeUI_V2(player);
        }

        
        [ConsoleCommand("promocode.remove")]
        private void RemovePromoCode(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null || arg.Args == null || arg.Args.Length < 1)
            {
                PrintWarning(lang.GetMessage("RemoveInvalidCommand", this)); 
                return;
            }

            if (!permission.UserHasPermission(player.UserIDString, "promocode.adminpanel"))
            {
                player.ChatMessage(lang.GetMessage("RemoveNoPermission", this, player.UserIDString));
                return;
            }

            string promoCode = arg.Args[0];

            if (config.PromoCodes.ContainsKey(promoCode))

                config.PromoCodes.Remove(promoCode);
        

                Config.WriteObject(config);

                player.ChatMessage(lang.GetMessage("PromoCodeRemoved", this, player.UserIDString).Replace("{promoCode}", promoCode));
                PrintWarning(lang.GetMessage("PromoCodeRemovedLog", this).Replace("{promoCode}", promoCode).Replace("{playerName}", player.displayName));
            }
            else
            {
                player.ChatMessage(lang.GetMessage("PromoCodeNotFound", this, player.UserIDString).Replace("{promoCode}", promoCode));
            }
        }



        private string Msg(string key, string userId = null)
        {
            return lang.GetMessage(key, this, userId);
        }

        private void CloseAllInterfaces(BasePlayer player)
        {

            CuiHelper.DestroyUi(player, "PromoCodeMenu");
        

            CuiHelper.DestroyUi(player, "PromoCodeMenuUI");
        

        }


        private void ActivatePromoCode(BasePlayer player, string promoCode)
        {
            string playerId = player.UserIDString;

            if (usedPromoCodesByPlayer.TryGetValue(playerId, out List<string> usedCodes) && usedCodes.Contains(promoCode))
            {
                SendPluginMessage(player, "PromoCodeAlreadyUsed");
                return;
            }

            if (promoCodeActivations.TryGetValue(promoCode, out int activations) && activations >= config.PromoCodes[promoCode].MaxActivations)
            {
                SendPluginMessage(player, "PromoCodeUnavailable");
                return;
            }

            if (config.PromoCodes.TryGetValue(promoCode, out PromoCodeData promoData))
            {
                if (!DateTime.TryParse(promoData.ExpiryDate, out DateTime expiryDate) || DateTime.Now > expiryDate)
                {
                    SendPluginMessage(player, "PromoCodeExpired");
                    return;
                }

                string rewardCommand = promoData.RewardCommand.Replace("{player}", playerId);
                rust.RunServerCommand(rewardCommand);

                promoCodeActivations[promoCode] = activations + 1;
                if (!usedPromoCodesByPlayer.ContainsKey(playerId))
                {
                    usedPromoCodesByPlayer[playerId] = new List<string>();
                }
                usedPromoCodesByPlayer[playerId].Add(promoCode);
                SaveData();

                SendPluginMessage(player, "PromoCodeActivated");


                if (config.EnablePromoCodeBroadcast)
                {
                    string message = Msg("PromoCodeActivatedBroadcast", player.UserIDString).Replace("{player}", player.displayName).Replace("{promoCode}", promoCode);
                    PrintToChat($"{config.MessagePrefix}{message}");
                }
                if (!string.IsNullOrEmpty(config.DiscordWebhookUrl))
                {
                    int remainingActivations = promoData.MaxActivations - promoCodeActivations[promoCode];
                    SendDiscordWebhook(player, promoCode, remainingActivations);
                }
                else
                {
                    Puts("The Discord webhook URL is not set.Skipping webhook send.");
                }

                Puts($"The promo code '{promoCode}' has been activated {promoCodeActivations[promoCode]} time(s).");
            }
            else
            {
                SendPluginMessage(player, "InvalidPromoCode");
            }
        }

        private void SendDiscordWebhook(BasePlayer player, string promoCode, int remainingActivations)
        {
            if (string.IsNullOrEmpty(config.DiscordWebhookUrl))
            {
                Puts("The Discord webhook URL is not set.Skipping webhook send.");
                return;
            }

            string playerName = player.displayName;
            string steamId = player.UserIDString;

            var embedPayload = new
            {
                embeds = new[]
                {
                    new
                    {
                        title = "🎉 Promo code activated! 🎉",
                        description = $"**Player:** {playerName}\n**Steam ID:** {steamId}\n**Promo code:** {promoCode}\n**Activations remaining:** {remainingActivations}",
                        color = 0x00FF00,
                        author = new
                        {
                            name = "Author: Barry_Allenn",
                            icon_url = "https://i.ibb.co/xHHfwjj/image.png",
                        },
                        footer = new
                        {
                            text = "Plugin PromoCode",
                            icon_url = "https://i.ibb.co/pfMxT7h/images.jpg"
                        },
                        timestamp = DateTime.UtcNow.ToString("o")

                    }
                }
            };

            string payload = JsonConvert.SerializeObject(embedPayload);

            webrequest.Enqueue(config.DiscordWebhookUrl, payload, (code, response) =>
            {
                if (code != 200 || string.IsNullOrEmpty(response))
                {

                }
            }, this, Oxide.Core.Libraries.RequestMethod.POST, new Dictionary<string, string> { { "Content-Type", "application/json" } });
        }



        protected override void LoadDefaultMessages()
        {

            lang.RegisterMessages(new Dictionary<string, string>
            {
                ["EnterPromoCode"] = "Enter your promo code",
                ["EnterPromoCodePlaceholder"] = "",
                ["Activate"] = "Activate",
                ["Close"] = "X",
                ["S_info"] = "Information",
                ["S_infotllo_line_1"] = "New promo code is here!",
                ["S_infotllo_line_2"] = "Where to find? Easy:",
                ["S_infotllo_line_3"] = "Watch our latest videos on TikTok",
                ["S_infotllo_line_4"] = "Or catch him on our Discord channel!",
                ["S_infotllo_line_5"] = "Don't miss your chance to get bonuses!",
                ["PromoCodeAlreadyUsed"] = "You have already used this promo code!",
                ["PromoCodeUnavailable"] = "This promo code is no longer available.",
                ["PromoCodeExpired"] = "This promo code has expired.",
                ["PromoCodeActivated"] = "Promo code activated!",
                ["InvalidPromoCode"] = "Invalid promo code.",
                ["PromoCodeActivatedBroadcast"] = "<color=#0099FF>{player}</color> has activated the promo code {promoCode}!",
                ["ExpiryDate"] = "Expiration Date: {0}",
                ["Activations"] = "Activations: {0}/{1}",
                ["S_delete"] = "Delete",
                ["PromoCodeNameEmpty"] = "Error: Promo code name is not specified.",
                ["PromoCodeCommandEmpty"] = "Error: Promo code command is not specified.",
                ["PromoCodeLimitInvalid"] = "Error: Activation limit is not specified or invalid.",
                ["PromoCodeExpiryDateEmpty"] = "Error: Expiry date is not specified.",
                ["PromoCodeCreated"] = "Promo code '{promoCodeName}' has been created with an expiration date of {promoCodeExpiryDate}!",
                ["PromoCodeExists"] = "Error: Promo code '{promoCodeName}' already exists.",
                ["LimitSaved"] = "Activation limit saved: {limit}",
                ["LimitError"] = "Error: Enter a valid number greater than zero for the activation limit.",
                ["PromoCodeNameEmpty"] = "Error: Promo code name cannot be empty.",
                ["PromoCodeNameSaved"] = "Promo code name saved: {promoCodeName}",
                ["PromoCodeCommandSaved"] = "Promo code command saved: {promoCodeCommand}",
                ["PromoCodeDateSaved"] = "Expiry date saved: {expiryDate}",
                ["PromoCodeDateError"] = "Error: Enter a valid date in YYYY-MM-DD format.",
                ["CommandPlayerOnly"] = "This command can only be used by a player.",
                ["RemoveInvalidCommand"] = "Invalid promo code removal command.",
                ["RemoveNoPermission"] = "You do not have permission to remove promo codes.",
                ["PromoCodeRemoved"] = "Promo code {promoCode} has been successfully removed.",
                ["PromoCodeRemovedLog"] = "Promo code {promoCode} was removed by admin {playerName}.",
                ["PromoCodeNotFound"] = "Promo code {promoCode} not found.",
                ["S_panelpromo"] = "Available Promo Codes:",
                ["S_adminpanel"] = "Admin panel",
                ["S_VDR"] = "Enter the name",
                ["S_VDRPR"] = "Example name 2025",
                ["S_CODR"] = "Enter the command for the promo code",
                ["S_CODRPR"] = "Example addgroup {player} vip 2d",
                ["S_CODRdata"] = "Expiration date",
                ["S_CODRFFdata"] = "Example 2025-1-31",
                ["S_CODRLIMIT"] = "Activation limit",
                ["S_CODRLIMFFIT"] = "Example 100"
            }, this);


            lang.RegisterMessages(new Dictionary<string, string>
            {
                ["EnterPromoCode"] = "Введите ваш промокод",
                ["EnterPromoCodePlaceholder"] = "",
                ["Activate"] = "Активировать",
                ["Close"] = "X",
                ["S_info"] = "Информация",
                ["S_infotllo_line_1"] = "Новый промокод уже здесь!",
                ["S_infotllo_line_2"] = "Где найти? Легко:",
                ["S_infotllo_line_3"] = "Смотри наши свежие видео на TikTok",
                ["S_infotllo_line_4"] = "Или лови его в нашем Discord-канале!",
                ["S_infotllo_line_5"] = "Не упусти свой шанс получить бонусы!",
                ["PromoCodeAlreadyUsed"] = "Вы уже использовали этот промокод!",
                ["PromoCodeUnavailable"] = "Этот промокод больше недоступен.",
                ["PromoCodeExpired"] = "Этот промокод истек.",
                ["PromoCodeActivated"] = "Промокод активирован!",
                ["InvalidPromoCode"] = "Недействительный промокод.",
                ["PromoCodeActivatedBroadcast"] = "<color=#0099FF>{player}</color> активировал промокод {promoCode}!",
                ["ExpiryDate"] = "Дата окончания: {0}",
                ["Activations"] = "Активации: {0}/{1}",
                ["S_delete"] = "Удалить",
                ["PromoCodeNameEmpty"] = "Ошибка: Имя промокода не указано.",
                ["PromoCodeCommandEmpty"] = "Ошибка: Команда для промокода не указана.",
                ["PromoCodeLimitInvalid"] = "Ошибка: Лимит активаций не указан или неверен.",
                ["PromoCodeExpiryDateEmpty"] = "Ошибка: Дата истечения не указана.",
                ["PromoCodeCreated"] = "Промокод '{promoCodeName}' создан с истечением {promoCodeExpiryDate}!",
                ["PromoCodeExists"] = "Ошибка: Промокод '{promoCodeName}' уже существует.",
                ["LimitSaved"] = "Лимит активаций сохранен: {limit}",
                ["LimitError"] = "Ошибка: Введите корректное число больше нуля для лимита активаций.",
                ["PromoCodeNameEmpty"] = "Ошибка: Имя промокода не может быть пустым.",
                ["PromoCodeNameSaved"] = "Имя промокода сохранено: {promoCodeName}",
                ["PromoCodeCommandSaved"] = "Команда для промокода сохранена: {promoCodeCommand}",
                ["PromoCodeDateSaved"] = "Дата истечения сохранена: {expiryDate}",
                ["PromoCodeDateError"] = "Ошибка: Введите корректную дату в формате YYYY-MM-DD.",
                ["CommandPlayerOnly"] = "Эта команда может быть вызвана только игроком.",
                ["RemoveInvalidCommand"] = "Некорректная команда удаления промо
// ... [Code preview truncated due to length. Full source in attached file] ...

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