Admin SQL [Argos/Standalone version]

В този раздел можете да качвате преработени плъгини.
Аватар
pok4
Извън линия
Потребител
Потребител
Мнения: 158
Регистриран на: 05 Фев 2022, 14:38
Се отблагодари: 1 път
Получена благодарност: 73 пъти

Admin SQL [Argos/Standalone version]

Мнение от pok4 » 18 Мар 2022, 17:43

Здравейте на всички :)

Преработих малко admin.sma плъгина от последната версия на АМХХ 1.10, за да работи с по-различна таблица и да има проверка за изтекъл админ.
Във версията тук колоните са преработени и може да добавяте админи от phpmyadmin или от скрипт (както аз).
Какво е преработеното ?
- добавени са нови колони start, end, ipaddr (ip:port на сървъра)
- добавена е проверка за изтичащ админ и трие всичко при следващия рестарт на сървъра

SQL:

Код за потвърждение: Избери целия код

CREATE TABLE IF NOT EXISTS `argos_admins` (
  `id` int NOT NULL AUTO_INCREMENT,
  `auth` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `password` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `access` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `flags` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `start` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `end` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `ipaddr` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='AMX Mod X Admins';
Забележка: тъй като не съм редактирал изцяло плъгина, а само част от него, трябва първо да инсертнете тази таблица и да настроите sql.cfg с данните за връзка към датабазата. Някой ако иска, може да си предефинира cvar-ите и да пробва с custom такива, ако sql.cfg го ползвате за друго... (не съм пробвал)

Още нещо:
Стартирайте сървъра си с +ip в командния ред на стартиращия ви скрипт. Въведете айпито на сървъра си, тъй като има вероятност редакциите да не сработят, ако това го няма.
Пример:
+ip 192.168.1.135 +port 27015.....и т.н.

Целия код:

Код за потвърждение: Избери целия код

// Uncomment for SQL version
#define USING_SQL

#include <amxmodx>
#include <amxmisc>
#if defined USING_SQL
#include <sqlx>
#endif

//new Vector:AdminList;

new AdminCount;

new PLUGINNAME[] = "AMX Mod X"

#define ADMIN_LOOKUP	(1<<0)
#define ADMIN_NORMAL	(1<<1)
#define ADMIN_STEAM		(1<<2)
#define ADMIN_IPADDR	(1<<3)
#define ADMIN_NAME		(1<<4)

new bool:g_CaseSensitiveName[MAX_PLAYERS + 1];

// pcvars
new amx_mode;
new amx_password_field;
new amx_default_access;

public plugin_init()
{
#if defined USING_SQL
	register_plugin("Admin Base (SQL)", AMXX_VERSION_STR, "AMXX Dev Team")
#else
	register_plugin("Admin Base", AMXX_VERSION_STR, "AMXX Dev Team")
#endif
	register_dictionary("admin.txt")
	register_dictionary("common.txt")
	amx_mode=register_cvar("amx_mode", "1", FCVAR_PROTECTED)
	amx_password_field=register_cvar("amx_password_field", "_pw", FCVAR_PROTECTED)
	amx_default_access=register_cvar("amx_default_access", "", FCVAR_PROTECTED)

	register_cvar("amx_vote_ratio", "0.02")
	register_cvar("amx_vote_time", "10")
	register_cvar("amx_vote_answers", "1")
	register_cvar("amx_vote_delay", "60")
	register_cvar("amx_last_voting", "0")
	register_cvar("amx_show_activity", "2", FCVAR_PROTECTED)
	register_cvar("amx_votekick_ratio", "0.40")
	register_cvar("amx_voteban_ratio", "0.40")
	register_cvar("amx_votemap_ratio", "0.40")

	set_cvar_float("amx_last_voting", 0.0)

#if defined USING_SQL
	register_srvcmd("amx_sqladmins", "adminSql")
	register_cvar("amx_sql_table", "argos_cs16_admins", FCVAR_PROTECTED)
#endif
	register_cvar("amx_sql_host", "127.0.0.1", FCVAR_PROTECTED)
	register_cvar("amx_sql_user", "root", FCVAR_PROTECTED)
	register_cvar("amx_sql_pass", "root", FCVAR_PROTECTED)
	register_cvar("amx_sql_db", "argos_cs16_admins", FCVAR_PROTECTED)
	register_cvar("amx_sql_type", "mysql", FCVAR_PROTECTED)
	register_cvar("amx_sql_timeout", "60", FCVAR_PROTECTED)

	register_concmd("amx_reloadadmins", "cmdReload", ADMIN_CFG)
	register_concmd("amx_addadmin", "addadminfn", ADMIN_RCON, "<playername|auth> <accessflags> [password] [authtype] - add specified player as an admin to users.ini")

	remove_user_flags(0, read_flags("z"))		// Remove 'user' flag from server rights

	new configsDir[64]
	get_configsdir(configsDir, charsmax(configsDir))

	server_cmd("exec %s/sql.cfg", configsDir)

	// Create a vector of 5 cells to store the info.
	//AdminList=vector_create(5);

	
#if defined USING_SQL
	server_cmd("amx_sqladmins")
#else
	format(configsDir, 63, "%s/users.ini", configsDir)
	loadSettings(configsDir)					// Load admins accounts
#endif
}
public client_connect(id)
{
	g_CaseSensitiveName[id] = false;
}
public addadminfn(id, level, cid)
{
	if (!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED
		
	new idtype = ADMIN_STEAM | ADMIN_LOOKUP

	if (read_argc() >= 5)
	{
		new t_arg[16]
		read_argv(4, t_arg, charsmax(t_arg))
		
		if (equali(t_arg, "steam") || equali(t_arg, "steamid") || equali(t_arg, "auth"))
		{
			idtype = ADMIN_STEAM
		}
		else if (equali(t_arg, "ip"))
		{
			idtype = ADMIN_IPADDR
		}
		else if (equali(t_arg, "name") || equali(t_arg, "nick"))
		{
			idtype = ADMIN_NAME
			
			if (equali(t_arg, "name"))
				idtype |= ADMIN_LOOKUP
		} else {
			console_print(id, "[%s] Unknown id type ^"%s^", use one of: steamid, ip, name", PLUGINNAME, t_arg)
			return PLUGIN_HANDLED
		}
	}

	new arg[33]
	read_argv(1, arg, charsmax(arg))
	new player = -1
	
	if (idtype & ADMIN_STEAM)
	{
		if (containi(arg, "STEAM_0:") == -1)
		{
			idtype |= ADMIN_LOOKUP
			player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS)
		} else {
			new _steamid[44]
			static _players[MAX_PLAYERS], _num, _pv
			get_players(_players, _num)
			for (new _i=0; _i<_num; _i++)
			{
				_pv = _players[_i]
				get_user_authid(_pv, _steamid, charsmax(_steamid))
				if (!_steamid[0])
					continue
				if (equal(_steamid, arg))
				{
					player = _pv
					break
				}
			}	
			if (player < 1)
			{
				idtype &= ~ADMIN_LOOKUP
			}		
		}
	}
	else if (idtype & ADMIN_NAME)
	{
		player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS)
		
		if (player)
			idtype |= ADMIN_LOOKUP
		else
			idtype &= ~ADMIN_LOOKUP
	}
	else if (idtype & ADMIN_IPADDR)
	{
		new len = strlen(arg)
		new dots, chars
		
		for (new i = 0; i < len; i++)
		{
			if (arg[i] == '.')
			{
				if (!chars || chars > 3)
					break
				
				if (++dots > 3)
					break
				
				chars = 0
			} else {
				chars++
			}
			
			if (dots != 3 || !chars || chars > 3)
			{
				idtype |= ADMIN_LOOKUP
				player = find_player("dh", arg)
			}
		}
	}
	
	if (idtype & ADMIN_LOOKUP && !player)
	{
		console_print(id, "%L", id, "CL_NOT_FOUND")
		return PLUGIN_HANDLED
	}
	
	new flags[64]
	read_argv(2, flags, charsmax(flags))

	new password[64]
	if (read_argc() >= 4) {
		read_argv(3, password, charsmax(password))
	}

	new auth[33]
	new Comment[MAX_NAME_LENGTH]; // name of player to pass to comment field
	if (idtype & ADMIN_LOOKUP)
	{
		get_user_name(player, Comment, charsmax(Comment))
		if (idtype & ADMIN_STEAM)
		{
			get_user_authid(player, auth, charsmax(auth))
		}
		else if (idtype & ADMIN_IPADDR)
		{
			get_user_ip(player, auth, charsmax(auth), 1)
		}
		else if (idtype & ADMIN_NAME)
		{
			get_user_name(player, auth, charsmax(auth))
		}
	} else {
		copy(auth, charsmax(auth), arg)
	}
	
	new type[16], len
	
	if (idtype & ADMIN_STEAM)
		len += format(type[len], charsmax(type) - len, "c")
	else if (idtype & ADMIN_IPADDR)
		len += format(type[len], charsmax(type) - len, "d")
	
	if (strlen(password) > 0)
		len += format(type[len], charsmax(type) - len, "a")
	else
		len += format(type[len], charsmax(type) - len, "e")
	
	AddAdmin(id, auth, flags, password, type, Comment)
	cmdReload(id, ADMIN_CFG, 0)

	if (player > 0)
	{
		new name[MAX_NAME_LENGTH]
		get_user_info(player, "name", name, charsmax(name))
		accessUser(player, name)
	}

	return PLUGIN_HANDLED
}

AddAdmin(id, auth[], accessflags[], password[], flags[], comment[]="")
{
#if defined USING_SQL
	new error[128], errno

	new Handle:info = SQL_MakeStdTuple()
	new Handle:sql = SQL_Connect(info, errno, error, charsmax(error))
	
	if (sql == Empty_Handle)
	{
		server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_CON", error)
		//backup to users.ini
#endif
		// Make sure that the users.ini file exists.
		new configsDir[64]
		get_configsdir(configsDir, charsmax(configsDir))
		format(configsDir, charsmax(configsDir), "%s/users.ini", configsDir)

		if (!file_exists(configsDir))
		{
			console_print(id, "[%s] File ^"%s^" doesn't exist.", PLUGINNAME, configsDir)
			return
		}

		// Make sure steamid isn't already in file.
		new line = 0, textline[256], len
		const SIZE = 63
		new line_steamid[SIZE + 1], line_password[SIZE + 1], line_accessflags[SIZE + 1], line_flags[SIZE + 1], parsedParams
		
		// <name|ip|steamid> <password> <access flags> <account flags>
		while ((line = read_file(configsDir, line, textline, charsmax(textline), len)))
		{
			if (len == 0 || equal(textline, ";", 1))
				continue // comment line

			parsedParams = parse(textline, line_steamid, SIZE, line_password, SIZE, line_accessflags, SIZE, line_flags, SIZE)
			
			if (parsedParams != 4)
				continue	// Send warning/error?
			
			if (containi(line_flags, flags) != -1 && equal(line_steamid, auth))
			{
				console_print(id, "[%s] %s already exists!", PLUGINNAME, auth)
				return
			}
		}

		// If we came here, steamid doesn't exist in users.ini. Add it.
		new linetoadd[512]
		
		if (comment[0]==0)
		{
			formatex(linetoadd, charsmax(linetoadd), "^r^n^"%s^" ^"%s^" ^"%s^" ^"%s^"", auth, password, accessflags, flags)
		}
		else
		{
			formatex(linetoadd, charsmax(linetoadd), "^r^n^"%s^" ^"%s^" ^"%s^" ^"%s^" ; %s", auth, password, accessflags, flags, comment)
		}
		console_print(id, "Adding:^n%s", linetoadd)

		if (!write_file(configsDir, linetoadd))
			console_print(id, "[%s] Failed writing to %s!", PLUGINNAME, configsDir)
#if defined USING_SQL
	}
	
	new table[32]
	
	get_cvar_string("amx_sql_table", table, charsmax(table))
	
	new Handle:query = SQL_PrepareQuery(sql, "SELECT * FROM `%s` WHERE (`auth` = '%s')", table, auth)

	if (!SQL_Execute(query))
	{
		SQL_QueryError(query, error, charsmax(error))
		server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error)
		console_print(id, "[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error)
	} else if (SQL_NumResults(query)) {
		console_print(id, "[%s] %s already exists!", PLUGINNAME, auth)
	} else {
		console_print(id, "Adding to database:^n^"%s^" ^"%s^" ^"%s^" ^"%s^"", auth, password, accessflags, flags)
	
		SQL_QueryAndIgnore(sql, "REPLACE INTO `%s` (`auth`, `password`, `access`, `flags`) VALUES ('%s', '%s', '%s', '%s')", table, auth, password, accessflags, flags)
	}
	
	SQL_FreeHandle(query)
	SQL_FreeHandle(sql)
	SQL_FreeHandle(info)
#endif

}

loadSettings(szFilename[])
{
	new File=fopen(szFilename,"r");
	
	if (File)
	{
		new Text[512];
		new Flags[32];
		new Access[32]
		new AuthData[44];
		new Password[32];
		
		while (fgets(File, Text, charsmax(Text)))
		{
			trim(Text);
			
			// comment
			if (Text[0]==';') 
			{
				continue;
			}
			
			Flags[0]=0;
			Access[0]=0;
			AuthData[0]=0;
			Password[0]=0;
			
			// not enough parameters
			if (parse(Text,AuthData,charsmax(AuthData),Password,charsmax(Password),Access,charsmax(Access),Flags,charsmax(Flags)) < 2)
			{
				continue;
			}
			
			admins_push(AuthData,Password,read_flags(Access),read_flags(Flags));

			AdminCount++;
		}
		
		fclose(File);
	}

	if (AdminCount == 1)
	{
		server_print("[AMXX] %L", LANG_SERVER, "LOADED_ADMIN");
	}
	else
	{
		server_print("[AMXX] %L", LANG_SERVER, "LOADED_ADMINS", AdminCount);
	}
	
	return 1;
}

#if defined USING_SQL
public adminSql()
{
	new table[32], error[128], type[12], errno
	
	new Handle:info = SQL_MakeStdTuple()
	new Handle:sql = SQL_Connect(info, errno, error, charsmax(error))
	
	get_cvar_string("amx_sql_table", table, charsmax(table))
	
	SQL_GetAffinity(type, charsmax(type))
	
	if (sql == Empty_Handle)
	{
		server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_CON", error)
		
		//backup to users.ini
		new configsDir[64]
		
		get_configsdir(configsDir, charsmax(configsDir))
		format(configsDir, charsmax(configsDir), "%s/users.ini", configsDir)
		loadSettings(configsDir) // Load admins accounts

		return PLUGIN_HANDLED
	}

	new Handle:query
	
	new szIP[ 64 ], szPort[ 15 ];
	get_cvar_string( "ip", szIP, 63 ); 
	get_cvar_string( "port", szPort, 14 ); 
	
	if (equali(type, "sqlite"))
	{
		if (!sqlite_TableExists(sql, table))
		{
			SQL_QueryAndIgnore(sql, "CREATE TABLE %s ( auth TEXT NOT NULL DEFAULT '', password TEXT NOT NULL DEFAULT '', access TEXT NOT NULL DEFAULT '', flags TEXT NOT NULL DEFAULT '' )", table)
		}

		query = SQL_PrepareQuery(sql, "SELECT auth, password, access, flags FROM %s WHERE `ipaddr`='%s:%s'", table, szIP, szPort)
		SQL_QueryAndIgnore(sql, "DELETE FROM %s WHERE end<%d", table, get_systime())
	} else {
		//SQL_QueryAndIgnore(sql, "CREATE TABLE IF NOT EXISTS `%s` ( `auth` VARCHAR( 32 ) NOT NULL, `password` VARCHAR( 32 ) NOT NULL, `access` VARCHAR( 32 ) NOT NULL, `flags` VARCHAR( 32 ) NOT NULL ) COMMENT = 'AMX Mod X Admins'", table)
		query = SQL_PrepareQuery(sql,"SELECT `auth`,`password`,`access`,`flags` FROM `%s` WHERE `ipaddr`='%s:%s'", table, szIP, szPort)
		SQL_QueryAndIgnore(sql, "DELETE FROM %s WHERE end<%d", table, get_systime())
	}

	if (!SQL_Execute(query))
	{
		SQL_QueryError(query, error, charsmax(error))
		server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error)
	} else if (!SQL_NumResults(query)) {
		server_print("[AMXX] %L", LANG_SERVER, "NO_ADMINS")
	} else {
		
		AdminCount = 0
		
		/** do this incase people change the query order and forget to modify below */
		new qcolAuth = SQL_FieldNameToNum(query, "auth")
		new qcolPass = SQL_FieldNameToNum(query, "password")
		new qcolAccess = SQL_FieldNameToNum(query, "access")
		new qcolFlags = SQL_FieldNameToNum(query, "flags")
		
		new AuthData[44];
		new Password[44];
		new Access[32];
		new Flags[32];
		
		while (SQL_MoreResults(query))
		{
			SQL_ReadResult(query, qcolAuth, AuthData, charsmax(AuthData));
			SQL_ReadResult(query, qcolPass, Password, charsmax(Password));
			SQL_ReadResult(query, qcolAccess, Access, charsmax(Access));
			SQL_ReadResult(query, qcolFlags, Flags, charsmax(Flags));
	
			admins_push(AuthData,Password,read_flags(Access),read_flags(Flags));
	
			++AdminCount;
			SQL_NextRow(query)
		}
	
		if (AdminCount == 1)
		{
			server_print("[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMIN")
		}
		else
		{
			server_print("[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMINS", AdminCount)
		}
		
		SQL_FreeHandle(query)
		SQL_FreeHandle(sql)
		SQL_FreeHandle(info)
	}
	
	return PLUGIN_HANDLED
}
#endif

public cmdReload(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED

	//strip original flags (patch submitted by mrhunt)
	remove_user_flags(0, read_flags("z"))
	
	admins_flush();

#if !defined USING_SQL
	new filename[128]
	
	get_configsdir(filename, charsmax(filename))
	format(filename, charsmax(filename), "%s/users.ini", filename)

	AdminCount = 0;
	loadSettings(filename);		// Re-Load admins accounts

	if (id != 0)
	{
		if (AdminCount == 1)
		{
			console_print(id, "[AMXX] %L", LANG_SERVER, "LOADED_ADMIN");
		}
		else
		{
			console_print(id, "[AMXX] %L", LANG_SERVER, "LOADED_ADMINS", AdminCount);
		}
	}
#else
	AdminCount = 0
	adminSql()

	if (id != 0)
	{
		if (AdminCount == 1)
			console_print(id, "[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMIN")
		else
			console_print(id, "[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMINS", AdminCount)
	}
#endif

	new players[MAX_PLAYERS], num, pv
	new name[MAX_NAME_LENGTH]
	get_players(players, num)
	for (new i=0; i<num; i++)
	{
		pv = players[i]
		get_user_name(pv, name, charsmax(name))
		accessUser(pv, name)
	}

	return PLUGIN_HANDLED
}

getAccess(id, name[], authid[], ip[], password[])
{
	new index = -1
	new result = 0
	
	static Count;
	static Flags;
	static Access;
	static AuthData[44];
	static Password[32];
	
	g_CaseSensitiveName[id] = false;

	Count=admins_num();
	for (new i = 0; i < Count; ++i)
	{
		Flags=admins_lookup(i,AdminProp_Flags);
		admins_lookup(i,AdminProp_Auth,AuthData,charsmax(AuthData));
		
		if (Flags & FLAG_AUTHID)
		{
			if (equal(authid, AuthData))
			{
				index = i
				break
			}
		}
		else if (Flags & FLAG_IP)
		{
			new c = strlen(AuthData)
			
			if (AuthData[c - 1] == '.')		/* check if this is not a xxx.xxx. format */
			{
				if (equal(AuthData, ip, c))
				{
					index = i
					break
				}
			}									/* in other case an IP must just match */
			else if (equal(ip, AuthData))
			{
				index = i
				break
			}
		} 
		else 
		{
			if (Flags & FLAG_CASE_SENSITIVE)
			{
				if (Flags & FLAG_TAG)
				{
					if (contain(name, AuthData) != -1)
					{
						index = i
						g_CaseSensitiveName[id] = true
						break
					}
				}
				else if (equal(name, AuthData))
				{
					index = i
					g_CaseSensitiveName[id] = true
					break
				}
			}
			else
			{
				if (Flags & FLAG_TAG)
				{
					if (containi(name, AuthData) != -1)
					{
						index = i
						break
					}
				}
				else if (equali(name, AuthData))
				{
					index = i
					break
				}
			}
		}
	}

	if (index != -1)
	{
		Access=admins_lookup(index,AdminProp_Access);

		if (Flags & FLAG_NOPASS)
		{
			result |= 8
			new sflags[32]
			
			get_flags(Access, sflags, charsmax(sflags))
			set_user_flags(id, Access)
			
			log_amx("Login: ^"%s<%d><%s><>^" became an admin (account ^"%s^") (access ^"%s^") (address ^"%s^")", name, get_user_userid(id), authid, AuthData, sflags, ip)
		}
		else 
		{
		
			admins_lookup(index,AdminProp_Password,Password,charsmax(Password));

			if (equal(password, Password))
			{
				result |= 12
				set_user_flags(id, Access)
				
				new sflags[32]
				get_flags(Access, sflags, charsmax(sflags))
				
				log_amx("Login: ^"%s<%d><%s><>^" became an admin (account ^"%s^") (access ^"%s^") (address ^"%s^")", name, get_user_userid(id), authid, AuthData, sflags, ip)
			} 
			else 
			{
				result |= 1
				
				if (Flags & FLAG_KICK)
				{
					result |= 2
					log_amx("Login: ^"%s<%d><%s><>^" kicked due to invalid password (account ^"%s^") (address ^"%s^")", name, get_user_userid(id), authid, AuthData, ip)
				}
			}
		}
	}
	else if (get_pcvar_float(amx_mode) == 2.0)
	{
		result |= 2
	} 
	else 
	{
		new defaccess[32]
		
		get_pcvar_string(amx_default_access, defaccess, charsmax(defaccess))
		
		if (!strlen(defaccess))
		{
			copy(defaccess, charsmax(defaccess), "z")
		}
		
		new idefaccess = read_flags(defaccess)
		
		if (idefaccess)
		{
			result |= 8
			set_user_flags(id, idefaccess)
		}
	}
	
	return result
}

accessUser(id, name[] = "")
{
	remove_user_flags(id)
	
	new userip[32], userauthid[32], password[32], passfield[32], username[MAX_NAME_LENGTH]
	
	get_user_ip(id, userip, charsmax(userip), 1)
	get_user_authid(id, userauthid, charsmax(userauthid))
	
	if (name[0])
	{
		copy(username, charsmax(username), name)
	}
	else
	{
		get_user_name(id, username, charsmax(username))
	}
	
	get_pcvar_string(amx_password_field, passfield, charsmax(passfield))
	get_user_info(id, passfield, password, charsmax(password))
	
	new result = getAccess(id, username, userauthid, userip, password)
	
	if (result & 1)
	{
		engclient_print(id, engprint_console, "* %L", id, "INV_PAS")
	}
	
	if (result & 2)
	{
		server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "NO_ENTRY")
		return PLUGIN_HANDLED
	}
	
	if (result & 4)
	{
		engclient_print(id, engprint_console, "* %L", id, "PAS_ACC")
	}
	
	if (result & 8)
	{
		engclient_print(id, engprint_console, "* %L", id, "PRIV_SET")
	}
	
	return PLUGIN_CONTINUE
}

public client_infochanged(id)
{
	if (!is_user_connected(id) || !get_pcvar_num(amx_mode))
	{
		return PLUGIN_CONTINUE
	}

	new newname[MAX_NAME_LENGTH], oldname[MAX_NAME_LENGTH]
	
	get_user_name(id, oldname, charsmax(oldname))
	get_user_info(id, "name", newname, charsmax(newname))

	if (g_CaseSensitiveName[id])
	{
		if (!equal(newname, oldname))
		{
			accessUser(id, newname)
		}
	}
	else
	{
		if (!equali(newname, oldname))
		{
			accessUser(id, newname)
		}
	}
	return PLUGIN_CONTINUE
}

public client_authorized(id)
	return get_pcvar_num(amx_mode) ? accessUser(id) : PLUGIN_CONTINUE

public client_putinserver(id)
{
	if (!is_dedicated_server() && id == 1)
		return get_pcvar_num(amx_mode) ? accessUser(id) : PLUGIN_CONTINUE
	
	return PLUGIN_CONTINUE
}
Това е целия код, ако имате съмнения просто го минете с този туул - https://www.diffchecker.com/diff като вкарате моята версия и оригиналната от чиста версия на АМХХ, за да видите къде са промените.

Това е най-правилния вариант поне според мен, за да имате смс админи. Не се бърка с нищо и работи бързо.
Скоро първия магазин към моята система Аргос ще проработи за CS 1.6 с този плъгин. Ще можете да си купувате всякакви флагове и срещу всеки ще има цена (в кредити).
Измислил съм го и ще бъде супер. Всичко ще може да се редактира (кои флагове, колко кредита да струват и за колко време ще е абонамента за конкретен сървър)

Ако имате проблеми или въпроси с версията по-горе - пишете.
Мога да ви дам малък скрипт, който да си позлвате за добавяне на админите.
Последно промяна от pok4 на 18 Мар 2022, 18:02, променено общо 1 път.

Аватар
pok4
Извън линия
Потребител
Потребител
Мнения: 158
Регистриран на: 05 Фев 2022, 14:38
Се отблагодари: 1 път
Получена благодарност: 73 пъти

Admin SQL [Argos/Standalone version]

Мнение от pok4 » 18 Мар 2022, 17:48

Да не редактирам горния пост, ето и примерна sql заявка за един админ:

Код за потвърждение: Избери целия код

INSERT INTO `argos_admins` (`id`, `auth`, `password`, `access`, `flags`, `start`, `end`, `ipaddr`) VALUES ('1', 'test', 'test12', 'abcde', 'a', '1647617378', '1650209378', '192.168.1.135:27015');
Ако мине доста време на start - current epoch
на end седи current epoch + 30 days in seconds

пс:
ето и web скрипта:

Код за потвърждение: Избери целия код

<form method='post' action=''> 
Nick<br /><input type='text' name='username' /><br />
PASS<br /><input  type='text' name='pass' size='20' /><br />
SMS Code<br /><input type='text' name='code2' size='20' />
<br />

<select name='action' class='input'>

<option value='192.168.1.135:27015'>Server1</option>
<option value='192.168.1.135:27016'>Server2</option>
<option value='192.168.1.135:27017'>Server3</option>
<option value='192.168.1.135:27018'>Server4</option>

</select>
<br />
<input type='submit' name='submit2' value='Send' />
</form>

<?php
/*db connection*/
mysql_connect("localhost","root","pass"); 
mysql_select_db("db"); 
/*db connection*/


//проверка за изтекли админи 
mysql_query("DELETE FROM argos_admins WHERE end<UNIX_TIMESTAMP()");
//край на проверката за изтекли админи


//Старт на проверката на смс кода за мобио
function mobio_checkcode2($servID4, $code, $debug=0) {
$res_lines = file("http://www.mobio.bg/code/checkcode.php?servID=$servID4&code=$code");
$ret = 0;
if($res_lines) {
if(strstr("PAYBG=OK", $res_lines[0])) {
$ret = 1;
}else{
if($debug)
echo $line."\n";
}
}else{
if($debug)
echo "Unable to connect to mobio.bg server.\n";
$ret = 0;
}
return $ret;
}
$servID4 = 18226; //за промяна (servid на мобио услугата)
$code = $_REQUEST["code2"];
$ok = $_REQUEST["submit2"];
if($ok) {
if(mobio_checkcode2($servID4, $code, 0) == 1) {

if(isset($_POST['submit2'])){

$nick= mysql_real_escape_string(trim($_POST["username"]));
$passche= mysql_real_escape_string(trim($_POST["pass"]));
$server= mysql_real_escape_string($_POST["action"]);
$created = time();
$expired = time() + (30 * 24 * 60 * 60);
$flags = "abcde"; //флаговете които ще получават вашите sms админи

mysql_query("INSERT INTO `argos_admins` (`auth`, `password`, `access`, `flags` , `start` ,`end`, `ipaddr`) VALUES ('$nick', '$passche', '$flags', 'a', '$created', '$expired', '$server')") or die(mysql_error());
}
echo "You are added in db succesfull!
";
}
else{
echo "Wrong SMS Code";

}
}
?>
Скрипта е писан отдавна и работи с mysql, но ако някой иска ще му го преработя с mysqli/pdo.
Той е примерен и работи с мобио. (не знам дали и въобще това им е последната версия на API-то или вече имат нова) или пък въобще не работят. (не се занимавам с тях)
Последно промяна от pok4 на 19 Мар 2022, 00:47, променено общо 1 път.

Аватар
FPS-Gam3r
Извън линия
Потребител
Потребител
Мнения: 110
Регистриран на: 27 Фев 2019, 18:29
Местоположение: България
Се отблагодари: 12 пъти
Получена благодарност: 34 пъти
Обратна връзка:

Admin SQL [Argos/Standalone version]

Мнение от FPS-Gam3r » 18 Мар 2022, 18:48

pok4 написа: 18 Мар 2022, 17:48 Да не редактирам горния пост, ето и примерна sql заявка за един админ:

Код за потвърждение: Избери целия код

INSERT INTO `argos_admins` (`id`, `auth`, `password`, `access`, `flags`, `start`, `end`, `ipaddr`) VALUES ('1', 'test', 'test12', 'abcde', 'a', '1647617378', '1650209378', '192.168.1.135:27015');
Ако мине доста време на start - current epoch
на end седи current epoch + 30 days in seconds

пс:
ето и web скрипта:

Код за потвърждение: Избери целия код

<form method='post' action=''> 
Nick<br /><input type='text' name='username' /><br />
PASS<br /><input  type='text' name='pass' size='20' /><br />
SMS Code<br /><input type='text' name='code2' size='20' />
<br />

<select name='action' class='input'>

<option value='192.168.1.135:27015'>Server1</option>
<option value='192.168.1.135:27016'>Server2</option>
<option value='192.168.1.135:27017'>Server3</option>
<option value='192.168.1.135:27018'>Server4</option>

</select>
<br />
<input type='submit' name='submit2' value='Send' />
</form>

<?php
/*db connection*/
mysql_connect("localhost","root","pass"); 
mysql_select_db("db"); 
/*db connection*/


//проверка за изтекли админи 
mysql_query("DELETE FROM admins WHERE end<UNIX_TIMESTAMP()");
//край на проверката за изтекли админи


//Старт на проверката на смс кода за мобио
function mobio_checkcode2($servID4, $code, $debug=0) {
$res_lines = file("http://www.mobio.bg/code/checkcode.php?servID=$servID4&code=$code");
$ret = 0;
if($res_lines) {
if(strstr("PAYBG=OK", $res_lines[0])) {
$ret = 1;
}else{
if($debug)
echo $line."\n";
}
}else{
if($debug)
echo "Unable to connect to mobio.bg server.\n";
$ret = 0;
}
return $ret;
}
$servID4 = 18226; //за промяна (servid на мобио услугата)
$code = $_REQUEST["code2"];
$ok = $_REQUEST["submit2"];
if($ok) {
if(mobio_checkcode2($servID4, $code, 0) == 1) {

if(isset($_POST['submit2'])){

$nick= mysql_real_escape_string(trim($_POST["username"]));
$passche= mysql_real_escape_string(trim($_POST["pass"]));
$server= mysql_real_escape_string($_POST["action"]);
$created = time();
$expired = time() + (30 * 24 * 60 * 60);
$flags = "abcde"; //флаговете които ще получават вашите sms админи

mysql_query("INSERT INTO `argos_admins` (`auth`, `password`, `access`, `flags` , `start` ,`end`, `ipaddr`) VALUES ('$nick', '$passche', '$flags', 'a', '$created', '$expired', '$server')") or die(mysql_error());
}
echo "You are added in db succesfull!
";
}
else{
echo "Wrong SMS Code";

}
}
?>
Скрипта е писан отдавна и работи с mysql, но ако някой иска ще му го преработя с mysqli/pdo.
Той е примерен и работи с мобио. (не знам дали и въобще това им е последната версия на API-то или вече имат нова) или пък въобще не работят. (не се занимавам с тях)
хубаво би било, ако взима селекта с сървъри от amx_servers, така ще олесниш много нещата ,даже с четири иннер джойн е възможно според Ник ,който е зададен в профила на потребителя да показва по малко сървъри с възможност за права (един вид проверка в кой сървър е админ въпросното лице и да му покаже само тези в които не е)

Аватар
pok4
Извън линия
Потребител
Потребител
Мнения: 158
Регистриран на: 05 Фев 2022, 14:38
Се отблагодари: 1 път
Получена благодарност: 73 пъти

Admin SQL [Argos/Standalone version]

Мнение от pok4 » 18 Мар 2022, 18:53

Да, това са подробности вече.
Тази таблица amx_servers от къде е, банлиста ли?

Аватар
FPS-Gam3r
Извън линия
Потребител
Потребител
Мнения: 110
Регистриран на: 27 Фев 2019, 18:29
Местоположение: България
Се отблагодари: 12 пъти
Получена благодарност: 34 пъти
Обратна връзка:

Admin SQL [Argos/Standalone version]

Мнение от FPS-Gam3r » 18 Мар 2022, 18:58

да там е , като си инсталираш амхбанс,или фрешбанс те се появяват много таблици, а реално ползваш четири, ще видя по късно довечера да ти направя дъмп,и да ти пресъздам моята идея

Аватар
pok4
Извън линия
Потребител
Потребител
Мнения: 158
Регистриран на: 05 Фев 2022, 14:38
Се отблагодари: 1 път
Получена благодарност: 73 пъти

Admin SQL [Argos/Standalone version]

Мнение от pok4 » 18 Мар 2022, 19:13

Схванах идеята, но някои хора може да ползват бан системите локално, което ще бъде проблем.
Аз мисля, че идеята да се въведат хостнеймовете и айпитата в конфигурационен файл работещ със самия екстеншън е удачна.

Това с инърджойните го схванах, но екстеншъна ще работи със същия юзър като phpbb и няма да се налага. Ще се селектират сървърите по юзър и ще му излиза къде е админ. С str replace после може да се изреждат някои стойности в стринга, който ще държи сървърите.

Аватар
JustyleR
Извън линия
Модератор
Модератор
Мнения: 560
Регистриран на: 24 Фев 2017, 18:59
Се отблагодари: 33 пъти
Получена благодарност: 132 пъти
Обратна връзка:

Admin SQL [Argos/Standalone version]

Мнение от JustyleR » 18 Мар 2022, 20:41

Вместо да се редактира главен плъгин според мен е хубаво да се използва оригиналния и в базата данни да се използва друга таблица която да запазва информацията за това кога са били добавени админите и кога им изтичат правата (ако са за време).
Също така ако това се контролира от сървъра (няма сайт в който да се правят тия проверки), то е хубаво да се напише отделен плъгин който да добавя тази информация в другата таблица. Нещо като amx_addadmin, но със допълнителна стойност за това колко време да бъде админ и съответно да се запазват нещата в таблицата. Да не говорим, че може да се направи и да работи локално.
И в 00:00ч. Да се правят проверки дали на някого правата са изтекли и да ги маха.

Няма лошо, че си се заиграл и си го направил, но няма голям смисъл от това, защото пак казвам, по-добре да се изтегли допълнителен плъгин, от колкото да се променя главен такъв.
Discord сървър, чрез който можете да се свържете с мен.


Аватар
pok4
Извън линия
Потребител
Потребител
Мнения: 158
Регистриран на: 05 Фев 2022, 14:38
Се отблагодари: 1 път
Получена благодарност: 73 пъти

Admin SQL [Argos/Standalone version]

Мнение от pok4 » 18 Мар 2022, 21:59

Много сложно ми се вижда твоето решение. Аз съм редактирал по-горе само 2-3 реда, а ти предлагаш цял плъгин да се създаде...

Не бих се занимавал с отделен плъгин, но ако някой иска - нека си направи и аз ще пре-редактирам скрипта, ако се налага.
Моето решение е бързо и не налага сложни действия от страна на потребителя...Втора таблица би наложила използването и на inner join-и и става дълго и широко.
И 2-та варианта налагат пипане по код, така че моето решение според мен засега е супер и пасва на моите нужди от към гледна точка на PHP и писането на магазин за закупуване на вип привилегии.

Аватар
JustyleR
Извън линия
Модератор
Модератор
Мнения: 560
Регистриран на: 24 Фев 2017, 18:59
Се отблагодари: 33 пъти
Получена благодарност: 132 пъти
Обратна връзка:

Admin SQL [Argos/Standalone version]

Мнение от JustyleR » 18 Мар 2022, 23:07

Не виждам за какво ще ползваш inner join след като ако се направи максимално читаво, ще се запазва ID-то на админа в другата таблица и при проверка, че му е изтекло времето ще се премахна с една проста заявка за изтриване по индекс.

Отделно за плъгина, имах предвид, че е по-добър вариант ако ще се прави максимално читаво, без играчка за редактиране на таблици, код по главен плъгин и т.н.

Системата която писах преди няколко години (която не препоръчвам да се ползва поради стар код) работи по същия начин.
Не трябват никакви пипания по плъгини, таблици и такива чудесии. Работи с амхбанс и всеки който има инсталиран то може да я подкара без проблем.
Discord сървър, чрез който можете да се свържете с мен.


Аватар
pok4
Извън линия
Потребител
Потребител
Мнения: 158
Регистриран на: 05 Фев 2022, 14:38
Се отблагодари: 1 път
Получена благодарност: 73 пъти

Admin SQL [Argos/Standalone version]

Мнение от pok4 » 18 Мар 2022, 23:18

ОК, разбрахте. Аз поне няма да се наема да правя плъгини, а и не съм толкова в час. Ако някой може да създаде подобно нещо, аз ще го включа като опция в Argos. Засега съм почнал да пиша по тази таблица по-горе.

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Преработени плъгини”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 8 госта