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);
}
}
}