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

FREE Auth : 2.9 2.9

Нет прав для скачивания
C#:
using Oxide.Game.Rust.Cui;
using UnityEngine;
using UnityEngine.UI;
using Oxide.Core;
using System;
using Oxide.Core.Database;
using System.Data.SQLite;
using System.Collections.Generic;
using System.Text.RegularExpressions;   
using System.Linq;

namespace Oxide.Plugins
{
	[Info("Auth", "ZeonRust", 2.9)]
	[Description("Auth plugin")]
	
	public class Auth : RustPlugin 
	{
	
		Core.SQLite.Libraries.SQLite sqlLibrary = Interface.Oxide.GetLibrary<Core.SQLite.Libraries.SQLite>();
        Connection sqlConnection;
		
		Dictionary<string, AuthPlayer> authPlayers = new Dictionary<string, AuthPlayer>();
		
		public class AuthPlayer
		{
			public bool registered;
			public bool authenticated;
			public bool changePass = false;
			public string password;
			
			
			public AuthPlayer(bool p_registered, bool p_authenticated, string p_password)
			{
				registered = p_registered;
				authenticated = p_authenticated;
				password = p_password;
			}
		}
		
		private void Loaded()
		{
			Puts("Loaded");
            sqlConnection = sqlLibrary.OpenDb("auth.sqlite", this, true);
			sqlLibrary.ExecuteNonQuery(Sql.Builder.Append(
			@"CREATE TABLE IF NOT EXISTS `players` (
			`id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
			`name`	TEXT NOT NULL,
			`steam_id`	TEXT NOT NULL,
			`reg_ip`	TEXT NOT NULL,
			`last_ip`	TEXT NOT NULL,
			`password`	TEXT NOT NULL,
			`reg_login_time`	INTEGER NOT NULL,
			`last_login_time`	INTEGER NOT NULL
			);"
			), sqlConnection);
			
			foreach (BasePlayer player in BasePlayer.activePlayerList) {
				var steamID = player.userID.ToString();
				authPlayers[steamID] = new AuthPlayer(true, true, null);
			}
		}
		
		[ConsoleCommand("deleteaccount")]
        void delAcc(ConsoleSystem.Arg arg) {
			var player = arg.Player();
			if (player != null) {
				PrintToChat(player, "Эта команда доступна только из консоли сервера!");
				return;
			}
			
			if (arg.Args == null || arg.Args.Length < 2) {
				Puts("Не хватает аргументов: /deleteaccount [steamid/ник]");
				return;
			}
			
			var steamOrName = arg.Args[0];
			
			sqlLibrary.Query(Sql.Builder.Append("select steam_id, name from players where steam_id = '" + steamOrName + "' or name = '" + steamOrName + "'"), sqlConnection, res => {
				var data = res.FirstOrDefault();
				if (data == null) {
					Puts("Пользователь с steamid/ником " + steamOrName + " не найден, его никогда не было на сервере.");
				} else {
					sqlLibrary.ExecuteNonQuery(Sql.Builder.Append(
					@"delete from players " +
					"where steam_id = " + data["steam_id"].ToString() + ";"
					), sqlConnection, i => {
						Puts("Аккаунт " + data["name"].ToString() + "/" + data["steam_id"].ToString() + " удален.");
					});	
				}
			});
		}
		
		[ConsoleCommand("adminchangepassword")]
        void adminChangePass(ConsoleSystem.Arg arg) {
			var player = arg.Player();
			if (player != null) {
				PrintToChat(player, "Эта команда доступна только из консоли сервера!");
				return;
			}
			
			if (arg.Args == null || arg.Args.Length < 2) {
				Puts("Не хватает аргументов: /adminchangepassword [steamid/ник] [новый пароль]");
				return;
			}
			
			var steamOrName = arg.Args[0];
			var newPass = arg.Args[1];
			
			sqlLibrary.Query(Sql.Builder.Append("select steam_id, name from players where steam_id = '" + steamOrName + "' or name = '" + steamOrName + "'"), sqlConnection, res => {
				var data = res.FirstOrDefault();
				if (data == null) {
					Puts("Пользователь с steamid/ником " + steamOrName + " не найден, его никогда не было на сервере.");
				} else {
					sqlLibrary.ExecuteNonQuery(Sql.Builder.Append(
					@"update players " +
					"set password = '" + newPass + "' " + 
					"where steam_id = " + data["steam_id"].ToString() + ";"
					), sqlConnection, i => {
						Puts("Пароль успешно изменен пользователю " + data["name"].ToString() + "/" + data["steam_id"].ToString());
					});	
				}
			});
		}
		
		
		[ChatCommand("changepassword")]
		void changePass(BasePlayer player) {
			var steamID = player.userID.ToString();
			
			sqlLibrary.Query(Sql.Builder.Append(@"select password from players where steam_id = '" + steamID + "'"), sqlConnection, res => {
				var data = res.FirstOrDefault();
				if (data == null) {
					PrintToChat(player, "Вас почему-то нет в базе, перезайдите.");
				} else {
					authPlayers[steamID] = new AuthPlayer(true, true, data["password"].ToString());
					authPlayers[steamID].changePass = true;
					showChangeePass(player);
				}
			});
		}
		
		//[ChatCommand("logout")]
		//void logout(BasePlayer player) {
		//	var steamID = player.userID.ToString();
		//	
		//	authPlayers[steamID] = new AuthPlayer(true, false, "test");
		//	showAuthorization(player);
		//}
		
		// игрок спавниться
		void OnPlayerSleepEnded(BasePlayer player)
		{	
			var steamID = player.userID.ToString();
			if (!authPlayers.ContainsKey(steamID)) { 
				sqlLibrary.Query(Sql.Builder.Append(@"select password, last_ip from players where steam_id = '" + steamID + "'"), sqlConnection, res => {
					var data = res.FirstOrDefault();
					if (data == null) {
						authPlayers[steamID] = new AuthPlayer(false, false, null);
						showRegistration(player);
					} else {
						AuthPlayer auth = new AuthPlayer(true, false, data["password"].ToString());
						authPlayers[steamID] = auth;
						
						string playerAddress = player.net.connection.ipaddress.Split(':')[0];
						if (data["last_ip"].ToString().Equals(playerAddress)) {
							auth.authenticated = true;
							authDB(player);
						} else {
							showAuthorization(player);
						}
					}
				});
			} else {
				AuthPlayer auth = authPlayers[steamID];
				if (!auth.authenticated) {
					if (auth.registered) {
						showAuthorization(player);
						} else {
						showRegistration(player);
					}
				}
			}
		}
		
		void OnPlayerDisconnected(BasePlayer player)
		{
			var steamID = player.userID.ToString();
			authPlayers.Remove(steamID);
		}
		
		Regex passwordRegex = new Regex(@"^[a-zA-Zа-яА-Я0-9_]+$");
		
		[ConsoleCommand("UI_auth")]
		void HelloCommand(ConsoleSystem.Arg arg) {
			var player = arg.Player();
            if(player == null) return;
			
			hideUI(player);
			
			var steamID = player.userID.ToString();
			if (authPlayers.ContainsKey(steamID)) {
				AuthPlayer auth = authPlayers[steamID];
				if (!auth.authenticated || auth.changePass) {
					// valid pass
					string error = "";
					string password = string.Join(" ", arg.Args).Trim();
					if (!auth.registered || auth.changePass) {
						if (password.Length < 6 || password.Length > 32) {
							error = "Пароль должен быть от 6 до 32 символов!";
						} else if (!passwordRegex.IsMatch(password)) {
							error = "Пароль должен состоять из русских или английских букв, цифр, а так же знака '_'!";
						}
					}
					
					if (!string.IsNullOrEmpty(error)){ 
						if (auth.changePass) {
							showChangeePass(player, error);
						} else if (auth.registered) {
							showAuthorization(player, error);
						} else {
							showRegistration(player, error);
						}	
					} else {
						if (auth.changePass) {
							auth.changePass = false;
							changePassDB(player, password);
						} else if (auth.registered) {
							if (!auth.password.Equals(password)) {
								showAuthorization(player, "Пароль неверен!");
							} else {
								auth.authenticated = true;
								authDB(player);
							}
						} else {
							auth.authenticated = true;
							auth.registered = true;
							registerDB(player, password);
						}
					}
				}
			}
		}
		
		void registerDB(BasePlayer player, string password) {
			var steamID = player.userID.ToString();
			string playerAddress = player.net.connection.ipaddress.Split(':')[0];
			string currentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
			
			sqlLibrary.ExecuteNonQuery(Sql.Builder.Append(
			@"INSERT INTO players (name, steam_id, reg_ip, last_ip, password, reg_login_time, last_login_time) " +
			"VALUES ('" + player.displayName + "', '" + steamID + "', '" + playerAddress + "', '" + playerAddress + "', '" + password + "', " + currentTime + ", " + currentTime + ");"
			), sqlConnection, i => {
				PrintToChat(player, "Вы успешно зарегистрировались.");
			});
		}
		
		void authDB(BasePlayer player) {
			var steamID = player.userID.ToString();
			string playerAddress = player.net.connection.ipaddress.Split(':')[0];
			string currentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
			
			sqlLibrary.ExecuteNonQuery(Sql.Builder.Append(
			@"update players " +
			"set last_ip='" + playerAddress + "', last_login_time = " + currentTime + " " + 
			"where steam_id = '" + steamID + "';"
			), sqlConnection, i => {
				PrintToChat(player, "Вы успешно авторизировались.");
			});	
		}
		
		void changePassDB(BasePlayer player, string password) {
			var steamID = player.userID.ToString();
			
			sqlLibrary.ExecuteNonQuery(Sql.Builder.Append(
			@"update players " +
			"set password='" + password + "' " + 
			"where steam_id = '" + steamID + "';"
			), sqlConnection, i => {
				PrintToChat(player, "Пароль успешно изменен.");
			});
		}
		
		string escape(string s) {
			return s.Replace("'", "''");
		}
		
		void showRegistration(BasePlayer player, string info = "") {
			if (string.IsNullOrEmpty(info)) {
				info = "Придумайте пароль и введите его ниже.\n" +
				"При каждом посещении вам необходимо подтверждать свой аккаунт с помощью введенного пароля.\n" +
				"Не ошибитесь!";
			}
			makeUI(player, "authPanel", 
			"РЕГИСТРАЦИЯ",
			info,
			$"UI_auth",
			"РЕГИСТРАЦИЯ"
			);	
		}
		
		void showChangeePass(BasePlayer player, string info = "") {
			if (string.IsNullOrEmpty(info)) {
				info = "Введите новый пароль.\n" + 
				"Не ошибитесь!";
			}
			makeUI(player, "authPanel", 
			"СМЕНА ПАРОЛЯ",
			info,
			$"UI_auth",
			"СМЕНИТЬ ПАРОЛЬ"
			);	
		}
		
		void showAuthorization(BasePlayer player, string info = "") {
			if (string.IsNullOrEmpty(info)) {
				info = "Вы уже создали аккаунт.\n" +
				"Введите пароль от аккаунта, который вы использовали во время регистрации.\n" + 
				"Если вы забыли пароль, пишите в лс группы - vk.com/zeonrust";
			}
			
			makeUI(player, "authPanel", 
			"АВТОРИЗАЦИЯ",
			info,
			$"UI_auth",
			"АВТОРИЗАЦИЯ"
			);	
		}
		
		void hideUI(BasePlayer player) {
			CuiHelper.DestroyUi(player, "authPanel");
		}
		
		void makeUI(BasePlayer player, string panelName, string title, string info, string command, string submitText) {
			CuiHelper.DestroyUi(player, panelName);
			
			CuiElementContainer container = UI.CreateElementContainer(
			"Overlay", panelName, "0 0 0 0.999", "0 0", "1 1", false);
			
			float y = 0.7f;
			string color = "0.56 0.29 0.56 1"; // цвет
			
			// old color "1 0.58 0 1"
			UI.CreateLabel(ref container, panelName, color, title, 46, "0 " + (y - 0.1f), "1 " + y, TextAnchor.MiddleCenter);
			
			y = y - 0.06f + 0.025f; 	// 0,025 между подсказками
			string[] infoList = info.Split('\n');
			foreach (string infoLine in infoList)  
            {  
				y -= 0.025f;
				UI.CreateLabel(ref container, panelName, "0.74 0.74 0.74 1", infoLine, 21, "0 " + (y - 0.1f), "1 " + y, TextAnchor.MiddleCenter); 
			}  
			
			y -= 0.08f;
			CuiElementContainer passContainer = UI.CreateElementContainer(panelName, "innerPanel", "0 0.13 0 1", "0.3 " + (y - 0.05f), "0.7 " + y, true);
			
			UI.CreateInputField(ref passContainer, "innerPanel", color, command, 26, "0 0", "1 1", TextAnchor.MiddleCenter);
			
			y -= 0.065f;
			UI.CreateButton(ref container, panelName, color, submitText, 26, "0.39 " + (y - 0.076f), "0.61 " + y, "", TextAnchor.MiddleCenter);
			
			CuiHelper.AddUi(player, container);
			CuiHelper.AddUi(player, passContainer);
		}
	}
	
	public class UI {
		static public void CreateInputField(ref CuiElementContainer container, string panel, string color, string command, int size, string aMin, string aMax, TextAnchor align = TextAnchor.MiddleCenter)
		{
			container.Add(new CuiElement
			{
				Parent = panel,
				Components =
				{
					new CuiInputFieldComponent { 
						Color = color, FontSize = size, Align = align, Text = "",
						Command = command
					},
					new CuiRectTransformComponent
					{
						AnchorMin = aMin,
						AnchorMax = aMax
					}
				}
			});
		}
		static public CuiElementContainer CreateElementContainer(string parent, string panelName, string color, string aMin, string aMax, bool useCursor)
		{
			var NewElement = new CuiElementContainer()
			{
				{
					new CuiPanel
					{
						Image = {Color = color},
						RectTransform = {AnchorMin = aMin, AnchorMax = aMax},
						CursorEnabled = useCursor
					},
					new CuiElement().Parent = parent,
					panelName
				}
			};
			return NewElement;
		}
		static public void CreatePanel(ref CuiElementContainer container, string panel, string color, string aMin, string aMax, bool cursor = false)
		{
			container.Add(new CuiPanel
			{
				Image = { Color = color },
				RectTransform = { AnchorMin = aMin, AnchorMax = aMax },
				CursorEnabled = cursor
			}, panel);
		}
		//UI.CreateImage(ref page_container, "ImgPage", "http image link here", "Img Name Here", "0 0", "1 1");
		static public void CreateImage(ref CuiElementContainer container, string panel, string url, string name, string aMin, string aMax, bool cursor = false)
		{
			container.Add(new CuiElement
			{
				Name = name,
				Parent = panel,
				Components =
				{
					new CuiRawImageComponent
					{
						Url = url
					},
					new CuiRectTransformComponent
					{
						AnchorMin = aMin,
						AnchorMax = aMax
					}
				}
			});
		}
		static public void CreateLabel(ref CuiElementContainer container, string panel, string color, string text, int size, string aMin, string aMax, TextAnchor align = TextAnchor.MiddleCenter)
		{
			container.Add(new CuiLabel
			{
				Text = { Color = color, FontSize = size, Align = align, Text = text },
				RectTransform = { AnchorMin = aMin, AnchorMax = aMax }
			}, panel);            
		}
		static public void CreateButton(ref CuiElementContainer container, string panel, string color, string text, int size, string aMin, string aMax, string command, TextAnchor align = TextAnchor.MiddleCenter)
		{
			container.Add(new CuiButton
			{
				Button = { Color = color, Command = command, FadeIn = 1.0f },
				RectTransform = { AnchorMin = aMin, AnchorMax = aMax },
				Text = { Text = text, FontSize = size, Align = align }
			}, panel);
		}
	}
}

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