Заявка за преработка на set admin и amxmodmenu

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
Fatall
Извън линия
Потребител
Потребител
Мнения: 295
Регистриран на: 30 Авг 2018, 09:35
Местоположение: София
Се отблагодари: 26 пъти
Получена благодарност: 17 пъти
Обратна връзка:

Заявка за преработка на set admin и amxmodmenu

Мнение от Fatall » 23 Яну 2020, 18:03

Може ли този пългин за добавяне на админи да изважда данните в amxmodmenuto колко време му остават от админ правата.
Пример: [HDservers] Aдминистратор [Права] Вие сте: Админн [Време] Остават ви: [26] дни.

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

#include <amxmodx>
#include <amxmisc>

#define PLUGIN "SET ADMIN"
#define VERSION "1.1"
#define AUTHOR "AUTHOR"

#define ADMIN_DUENO ADMIN_RCON

new Array:Admins, g_admin_tipes, user_menu, g_tipe

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_cvar("SETADMIN", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
	register_concmd("amx_setadminmenu", "cmd_set_admin")

	load()
}
load()
{
	g_admin_tipes = 0
	Admins = ArrayCreate(64, 1)

	new File[120]; get_configsdir(File, charsmax(File))
	add(File, charsmax(File), "/AdminConfig.ini")

	if(!file_exists(File))
		set_fail_state("File configs/AdminConfig.ini Not Found")

	new Linea[100], open = fopen(File, "rt")

	while(!feof(open))
	{
		fgets(open, Linea, charsmax(Linea))
		trim(Linea)

		if(!Linea[0] || Linea[0] == ';')
			continue;

		ArrayPushString(Admins, Linea)
		g_admin_tipes++
	}
	fclose(open)
}

public cmd_set_admin(id)
{
	if(get_user_flags(id) & ADMIN_DUENO)
		show_players_menu(id)
}
show_players_menu(id)
{
	new menu = menu_create("\r[\wHDservers\r] \ySelect Players \w| \yStep: \r[\w1/3\r] \w| \yPage: \r", "handler_players_menu")

	new szname[50], num[2], g_max = get_maxplayers()

	for(new i = 1; i <= g_max; i++)
	{
		if(!is_user_connected(i) || i == id)
			continue;

		get_user_name(i, szname, charsmax(szname))
		if(is_user_admin(i)) add(szname, charsmax(szname), " - \r[ADMIN]")

		num[0] = i
		num[1] = 0

		menu_additem(menu, szname, num)
	}
	menu_display(id, menu, 0)
}
public handler_players_menu(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu)
		return PLUGIN_HANDLED;
	}
	new deal, buffer[2]
	menu_item_getinfo(menu, item, deal, buffer, charsmax(buffer), _, _, deal)
	user_menu =  buffer[0]

	if(!is_user_connected(user_menu))
	{
		ColorMessage(id, "^4[HDservers] ^1The selected user is ^3disconnected ^1from the menu.")
		return PLUGIN_HANDLED;
	}
	if(is_user_admin(user_menu))
	{
		ColorMessage(id, "^4[HDservers] ^1The ^4selected ^1user is ^3admin^1.")
		return PLUGIN_HANDLED;
	}

	show_selec_tipe(id)

	return PLUGIN_HANDLED;
}
show_selec_tipe(id)
{
	new menu, len[80], UserMenuName[33]; get_user_name(user_menu, UserMenuName, 32)

	formatex(len, charsmax(len), "\r[\wHDservers\r] \yGive Add \r%s \w| \yStep \r[\w2/3\r]", UserMenuName)
	menu = menu_create(len, "handler_selectipe")

	menu_additem(menu, "Name", "1")
	menu_additem(menu, "Steam", "2")
	menu_additem(menu, "IP", "3")

	menu_display(id, menu, 0)
}
public handler_selectipe(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		show_players_menu(id)
		return PLUGIN_HANDLED;
	}

	if(!is_user_connected(user_menu))
	{
		ColorMessage(id, "^4[HDservers] ^1The selected user is ^3disconnected ^1from the menu.")
		return PLUGIN_HANDLED;
	}

	g_tipe = item
	show_selec_admin(id)
	return PLUGIN_HANDLED;
}
show_selec_admin(id)
{
	new num[2], menu, len[75], UserMenuName[33]; get_user_name(user_menu, UserMenuName, 32)

	formatex(len, charsmax(len), "\r[\wHDservers\r] \yGive Flags \r%s \w| \yStep \r[\w3/3\r]", UserMenuName)
	menu = menu_create(len, "handler_selecadmin")

	new Data[100], AdminTipeName[15], AdminFlags[35]

	for(new i = 0; i < g_admin_tipes; i++)
	{
		ArrayGetString(Admins, i, Data, charsmax(Data))
		parse(Data, AdminTipeName, charsmax(AdminTipeName), AdminFlags, charsmax(AdminFlags))

		formatex(len, charsmax(len), "\w%s - \r[\w%s\r]", AdminTipeName, AdminFlags)
		num_to_str(i, num, 1)
		menu_additem(menu, len, num)
	}

	menu_display(id, menu, 0)
}
public handler_selecadmin(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		show_selec_tipe(id)
		return PLUGIN_HANDLED;
	}

	if(!is_user_connected(user_menu))
	{
		ColorMessage(id, "^4[HDservers] ^1The selected user is ^3disconnected ^1from the menu.")
		return PLUGIN_HANDLED;
	}

	new Data[100], AdminTipeName[15], AdminFlags[35]

	new Admin[33], NewAdmin[33]
	get_user_name(id, Admin, 32)
	get_user_name(user_menu, NewAdmin, 32)

	ArrayGetString(Admins, item, Data, charsmax(Data))
	parse(Data, AdminTipeName, charsmax(AdminTipeName), AdminFlags, charsmax(AdminFlags))

	set_user_admin(user_menu, AdminFlags, g_tipe)
	ColorMessage(0, "^4[HDservers] ^1ADMIN [^3%s^1] ^1gave [^4%s^1] on [^3%s^1] Congratulations!", Admin, AdminTipeName, NewAdmin)

	return PLUGIN_HANDLED;
}
set_user_admin(target, Flags[], tipo)
{
	new ident[33], pw[5], linne[150]
	formatex(pw, 4, "%d%d%d%d", random_num(1, 9), random_num(1, 9), random_num(1, 9), random_num(1, 9))

	new File[120]; get_configsdir(File, charsmax(File))
	add(File, charsmax(File), "/users.ini")

	if(!file_exists(File))
		set_fail_state("File configs/users.ini Not Found")

	new szTime[32]
	get_time("%d.%m.%Y - %H:%M", szTime, charsmax(szTime))

	switch(tipo)
	{
		case 0:
		{
			get_user_name(target, ident, charsmax(ident))
			formatex(linne, charsmax(linne), "^r^n^"%s^" ^"%s^" ^"%s^" ^"a^" ^"%s^"", ident, pw, Flags, szTime)

			client_print(target, print_console, "------------------- | HDSERVERS SET ADMINS |-------------------")
			client_print(target, print_console, "[HDservers] You have been kiked because you have been given admin")
			client_print(target, print_console, "[HDservers] Your password|setinfo is: %s", pw)
			client_print(target, print_console, "[HDservers] You should put in your console: setinfo _pw %s", pw)
			client_print(target, print_console, "------------------- | by: sed1 |-------------------")
			server_cmd("kick #%d ^"You have been kiked because administrator is given, your password is %s, for more information see their console^"", get_user_userid(target), pw)
		}
		case 1:
		{
			get_user_authid(target, ident, charsmax(ident))
			formatex(linne, charsmax(linne), "^r^n^"%s^" ^"^" ^"%s^" ^"ce^" ^"%s^"", ident, Flags, szTime)
		}
		case 2:
		{
			get_user_ip(target, ident, charsmax(ident), 1)
			formatex(linne, charsmax(linne), "^r^n^"%s^" ^"^" ^"%s^" ^"de^" ^"%s^"", ident, Flags, szTime)
		}
	}
	/*new ident_user[35], Linea[150], open = fopen(File, "rt")

	while(!feof(open))
	{
		fgets(open, Linea, charsmax(Linea))
		trim(Linea)

		if(!Linea[0] || Linea[0] == ";")
			continue;

		parse(Linea, ident_user, charsmax(ident_user))

		if(equal(ident, ident_user))
		{
			ColorMessage(id, "^4[HDservers] ^3%s ^1Already exists!", ident)
			//break;
			return PLUGIN_HANDLED;
		}
	}
	fclose(open)	*/
	//the menu is checked if admin

	write_file(File, linne)
	server_cmd("amx_reloadadmins")
}

stock ColorMessage(const id, const input[], any:...)
{
   new count = 1, players[32];
   static msg[ 191 ];
   vformat(msg, 190, input, 3);
   if (id) players[0] = id; else get_players(players , count , "ch"); {
   for (new i = 0; i < count; i++){
   if (is_user_connected(players[i])){
   message_begin(MSG_ONE_UNRELIABLE , get_user_msgid("SayText"), _, players[i]);
   write_byte(players[i]);
   write_string(msg);
   message_end();}}}
}

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

#include <amxmodx>
#include <amxmisc>
#include <cstrike>

#pragma tabsize 0

#define MAXMENUS			128
#define STRINGSIZE			32
#define STRINGLENGTH 		STRINGSIZE - 1
#define MENUITEMSPERPAGE	8

new g_menuPosition[33]
new g_menusNumber = 0
new g_menuBody[MAXMENUS][STRINGSIZE]
new bool:g_menuBodyPhrase[MAXMENUS]
new g_menuCmd[MAXMENUS][STRINGSIZE]
new g_menuAccess[MAXMENUS]
new g_menuPlugin[MAXMENUS][STRINGSIZE]
new g_coloredMenus
new g_clientMenuPosition[33]
new g_clientMenusNumber = 0
new g_clientMenuBody[MAXMENUS][STRINGSIZE]
new bool:g_clientMenuBodyPhrase[MAXMENUS]
new g_clientMenuCmd[MAXMENUS][STRINGSIZE]
new g_clientMenuAccess[MAXMENUS]
new g_clientMenuPlugin[MAXMENUS][STRINGSIZE]


public AddMenu(const menuBody[], const menuCmd[], const menuAccess, const menuPlugin[])
{
	if (g_menusNumber + 1 == MAXMENUS)
	{
		log_amx("Error: Plugin ^"%s^" tried to add a menu item to Menu Front-End plugin with maximum menu items reached!", menuPlugin)
		return
	}

	copy(g_menuBody[g_menusNumber], STRINGLENGTH, menuBody)
	g_menuBodyPhrase[g_menusNumber] = false
	
	copy(g_menuCmd[g_menusNumber], STRINGLENGTH, menuCmd)
	g_menuAccess[g_menusNumber] = menuAccess
	
	copy(g_menuPlugin[g_menusNumber], STRINGLENGTH, menuPlugin)

	g_menusNumber++
	server_print("Menu item %d added to Menus Front-End: ^"%s^" from plugin ^"%s^"", g_menusNumber, menuBody, menuPlugin)
}

public AddMenuLang(const menuBody[], const menuCmd[], const menuAccess, const menuPlugin[])
{
	if (g_menusNumber + 1 == MAXMENUS)
	{
		log_amx("Error: Plugin ^"%s^" tried to add a menu item to Menu Front-End plugin with maximum menu items reached!", menuPlugin)
		return
	}

	copy(g_menuBody[g_menusNumber], STRINGLENGTH, menuBody)
	g_menuBodyPhrase[g_menusNumber] = true
	
	copy(g_menuCmd[g_menusNumber], STRINGLENGTH, menuCmd)
	g_menuAccess[g_menusNumber] = menuAccess
	
	copy(g_menuPlugin[g_menusNumber], STRINGLENGTH, menuPlugin)
	g_menusNumber++

	//server_print("Menu item %d added to Menus Front-End: ^"%s^" (LANG) from plugin ^"%s^"", g_menusNumber, menuBody, menuPlugin)
}

public AddClientMenu(const menuBody[], const menuCmd[], const menuAccess, const menuPlugin[])
{
	if (g_clientMenusNumber + 1 == MAXMENUS)
	{
		log_amx("Error: Plugin ^"%s^" tried to add a menu item to Menu Front-End plugin with maximum menu items reached!", menuPlugin)
		return
	}

	copy(g_clientMenuBody[g_clientMenusNumber], STRINGLENGTH, menuBody)
	g_clientMenuBodyPhrase[g_clientMenusNumber] = false
	
	copy(g_clientMenuCmd[g_clientMenusNumber], STRINGLENGTH, menuCmd)
	g_clientMenuAccess[g_clientMenusNumber] = menuAccess
	
	copy(g_clientMenuPlugin[g_clientMenusNumber], STRINGLENGTH, menuPlugin)

	g_clientMenusNumber++
	server_print("Client menu item %d added to Client Menus Front-End: ^"%s^" from plugin ^"%s^"", g_clientMenusNumber, menuBody, menuPlugin)
}

AddDefaultMenus()
{
	new flags;
	AddMenuLang("KICK_PLAYER", "amx_kickmenu", get_clcmd_flags("amx_kickmenu", flags) ? flags : ADMIN_KICK , "Players Menu")
	AddMenuLang("BAN_PLAYER", "amx_banmenu", get_clcmd_flags("amx_banmenu", flags) ? flags : ADMIN_BAN, "Players Menu")
	AddMenuLang("SLAP_SLAY", "amx_slapmenu", get_clcmd_flags("amx_slapmenu", flags) ? flags : ADMIN_SLAY, "Players Menu")
	AddMenuLang("TEAM_PLAYER", "amx_teammenu", get_clcmd_flags("amx_teammenu", flags) ? flags : ADMIN_LEVEL_A, "Players Menu")
	AddMenuLang("CHANGEL", "amx_mapmenu", get_clcmd_flags("amx_mapmenu", flags) ? flags : ADMIN_MAP, "Maps Menu")
	AddMenuLang("ADD_ADMIN", "amx_setadminmenu", ADMIN_RCON, "Players Menu")
	AddMenuLang("GAG_PLAYER", "amx_gagmenu", ADMIN_KICK, "Players Menu")
	AddMenuLang("BANCFG_PLAYER", "amx_bancfgmenu", ADMIN_RCON, "Players Menu")
	AddMenuLang("CVARS_SET", "amx_cvarmenu", get_clcmd_flags("amx_cvarmenu", flags) ? flags : ADMIN_CVAR, "Commands Menu")
}


stock bool:get_clcmd_flags(const search_command[], &flags)
{
	new count = get_clcmdsnum(-1);
	static cmd[128];
	static info[1];
	new _flags;

	for (new i = 0; i < count; i++)
	{
		get_clcmd(i, cmd, charsmax(cmd), _flags, info, charsmax(info), -1);

		if (strcmp(cmd, search_command) == 0)
		{
			flags = _flags;
			return true;
		}
	}

	return false;
}
public actionMenu(id, key)
{
	switch (key)
	{
		case 8: displayMenu(id, ++g_menuPosition[id])
		case 9: displayMenu(id, --g_menuPosition[id])
		default: client_cmd(id, "%s", g_menuCmd[g_menuPosition[id] * 8 + key])
	}
	
	return PLUGIN_HANDLED
}

public clientActionMenu(id, key)
{
	switch (key)
	{
		case 8: clientDisplayMenu(id, ++g_clientMenuPosition[id])
		case 9: clientDisplayMenu(id, --g_clientMenuPosition[id])
		default: client_cmd(id, "%s", g_clientMenuCmd[g_clientMenuPosition[id] * 8 + key])
	}
	
	return PLUGIN_HANDLED
}

displayMenu(id, pos)
{
	if (pos < 0)
		return

	new menuBody[512]
	new b = 0
	new start = pos * MENUITEMSPERPAGE

	if (start >= g_menusNumber)		// MENUS_NUMBER
		start = pos = g_menuPosition[id] = 0

	new len = format(menuBody, 511, 
	
	g_coloredMenus ? "\r[\wHDservers\r] \yAdmin Panel \R%d/%d^n\w^n" : "\r[\wHDservers\r] \yAdmin Panel %d/%d^n^n" , pos + 1, (g_menusNumber / MENUITEMSPERPAGE) + (((g_menusNumber % MENUITEMSPERPAGE) > 0) ? 1 : 0))

	new end = start + MENUITEMSPERPAGE
	new keys = MENU_KEY_0

	if (end > g_menusNumber)		// MENUS_NUMBER
		end = g_menusNumber			// MENUS_NUMBER

	for (new a = start; a < end; ++a)
	{
		if ( access(id, g_menuAccess[a]) && 
			((is_plugin_loaded(g_menuPlugin[a]) != -1) ||			// search plugins for registered name
			 (is_plugin_loaded(g_menuPlugin[a], true) != -1)))	// search plugins for filename
		{
			keys |= (1<<b)
			
			if (g_menuBodyPhrase[a])
				len += format(menuBody[len], 511-len, "\r%d. \w%L^n", ++b, id, g_menuBody[a])
			else
				len += format(menuBody[len], 511-len, "\r%d. \w%s^n", ++b, g_menuBody[a])
		} else {
			++b
			
			if (g_coloredMenus)
			{
				if (g_menuBodyPhrase[a])
					len += format(menuBody[len], 511-len, "\d%d. %L^n\w", b, id, g_menuBody[a])
				else
					len += format(menuBody[len], 511-len, "\d%d. %s^n\w", b, g_menuBody[a])
			} else {
				if (g_menuBodyPhrase[a])
					len += format(menuBody[len], 511-len, "#. %L^n", id, g_menuBody[a])
				else
					len += format(menuBody[len], 511-len, "#. %s^n", g_menuBody[a])
			}
		}
	}

	if (end != g_menusNumber)		// MENUS_NUMBER
	{
		format(menuBody[len], 511-len, "^n\r9. \w%L...^n\r0. \w%L", id, "MORE", id, pos ? "BACK" : "EXIT")
		keys |= MENU_KEY_9
	} else {
		format(menuBody[len], 511-len, "^n\r0. \w%L", id, pos ? "BACK" : "EXIT")
	}

	show_menu(id, keys, menuBody)
}

clientDisplayMenu(id, pos)
{
	if (pos < 0)
		return

	new menuBody[512]
	new b = 0
	new start = pos * MENUITEMSPERPAGE

	if (start >= g_clientMenusNumber)		// MENUS_NUMBER
		start = pos = g_clientMenuPosition[id] = 0

	new len = format(menuBody, 511, g_coloredMenus ? "\r[\wHDservers\r] \yAdmin Panel \R%d/%d^n\w^n" : "\r[\wHDservers\r] \wAdmin Panel %d/%d^n^n" , pos + 1, (g_clientMenusNumber / MENUITEMSPERPAGE) + (((g_clientMenusNumber % MENUITEMSPERPAGE) > 0) ? 1 : 0))

	new end = start + MENUITEMSPERPAGE
	new keys = MENU_KEY_0

	if (end > g_clientMenusNumber)			// MENUS_NUMBER
		end = g_clientMenusNumber			// MENUS_NUMBER

	for (new a = start; a < end; ++a)
	{
		if ( access(id, g_clientMenuAccess[a]) && 
			((is_plugin_loaded(g_clientMenuPlugin[a]) != -1) ||			// search plugins for registered name
			 (is_plugin_loaded(g_clientMenuPlugin[a], true) != -1)))		// search plugins for file name
		{
			keys |= (1<<b)
			
			if (g_clientMenuBodyPhrase[a])
				len += format(menuBody[len], 511-len, "\r%d. \w%L^n", ++b, id, g_clientMenuBody[a])
			else
				len += format(menuBody[len], 511-len, "\r%d. \w%s^n", ++b, g_clientMenuBody[a])
		} else {
			++b
			
			if (g_coloredMenus)
			{
				if (g_clientMenuBodyPhrase[a])
					len += format(menuBody[len], 511-len, "\d%d. %L^n\w", b, id, g_clientMenuBody[a])
				else
					len += format(menuBody[len], 511-len, "\d%d. %s^n\w", b, g_clientMenuBody[a])
			} else {
				if (g_clientMenuBodyPhrase[a])
					len += format(menuBody[len], 511-len, "#. %L^n", id, g_clientMenuBody[a])
				else
					len += format(menuBody[len], 511-len, "#. %s^n", g_clientMenuBody[a])
			}
		}
	}

	if (end != g_clientMenusNumber)			// MENUS_NUMBER
	{
		format(menuBody[len], 511-len, "^n\r9. \w%L...^n\r0. \w%L", id, "MORE", id, pos ? "BACK" : "EXIT")
		keys |= MENU_KEY_9
	}
	else {
		format(menuBody[len], 511-len, "^n\r0. \w%L", id, pos ? "BACK" : "EXIT")
	}

	show_menu(id, keys, menuBody)
}

public cmdMenu(id, level, cid)
{
	if (cmd_access(id, level, cid, 1))
		displayMenu(id, g_menuPosition[id] = 0)

	return PLUGIN_HANDLED
}
public clientCmdMenu(id, level, cid)
{
	if (cmd_access(id, level, cid, 1))
		clientDisplayMenu(id, g_clientMenuPosition[id] = 0)

	return PLUGIN_HANDLED
}

public addmenuitem_cmd(id, level, cid)
{
	if (!cmd_access(id, level, cid, 5))
		return PLUGIN_HANDLED

	// AddMenu(const menuBody[], const menuCmd[], const menuAccess, const menuPlugin[])
	new menuBody[STRINGSIZE], menuCmd[STRINGSIZE], flags[STRINGSIZE], menuAccess = 0, menuPlugin[STRINGSIZE]
	read_argv(1, menuBody, STRINGLENGTH)
	read_argv(2, menuCmd, STRINGLENGTH)
	read_argv(3, flags, STRINGLENGTH)
	menuAccess = read_flags(flags)
	read_argv(4, menuPlugin, STRINGLENGTH)

	AddMenu(menuBody, menuCmd, menuAccess, menuPlugin)

	return PLUGIN_HANDLED
}

public addclientmenuitem_cmd(id, level, cid)
{
	if (!cmd_access(id, level, cid, 5))
		return PLUGIN_HANDLED

	// AddMenu(const menuBody[], const menuCmd[], const menuAccess, const menuPlugin[])
	new menuBody[STRINGSIZE], menuCmd[STRINGSIZE], flags[STRINGSIZE], menuAccess = 0, menuPlugin[STRINGSIZE]
	read_argv(1, menuBody, STRINGLENGTH)
	read_argv(2, menuCmd, STRINGLENGTH)
	read_argv(3, flags, STRINGLENGTH)
	menuAccess = read_flags(flags)
	read_argv(4, menuPlugin, STRINGLENGTH)

	AddClientMenu(menuBody, menuCmd, menuAccess, menuPlugin)

	return PLUGIN_HANDLED
}

public plugin_init()
{
	register_plugin("Menus Front-End", AMXX_VERSION_STR, "AMXX Dev Team")
	register_dictionary("menufront.txt")
	register_dictionary("common.txt")
	register_menucmd(register_menuid("\r[\wHDservers\r] \yAdmin Panel"), 1023, "actionMenu")
	register_menucmd(register_menuid("\r[\wHDservers\r] \yAdmin Panel"), 1023, "clientActionMenu")
	register_clcmd("amxmodmenu", "cmdMenu", ADMIN_MENU, "- displays menus")
	register_clcmd("amx_menu", "clientCmdMenu", 0, "- displays menus available to client")
	register_srvcmd("amx_addmenuitem", "addmenuitem_cmd", 0, "<menu text> <menu command> <access flags> <plugin name | plugin filename> - Add a menu item to Menus Front-End")
	register_srvcmd("amx_addclientmenuitem", "addclientmenuitem_cmd", 0, "<menu text> <menu command> <access flags> <plugin name | plugin filename> - Add a menu item to Client Menus Front-End")
	
	g_coloredMenus = colored_menus()
}

public plugin_cfg()
{
	AddDefaultMenus()

	new configs[128]
	get_configsdir(configs, 127)
	server_cmd("exec %s/custommenuitems.cfg", configs)
}

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

<?php
   $error_msg = "Database error in [page].php / ";
   $error_msg .= mysqli_error ( $link )." / ";
   $error_msg .= $query;
   UpdateLog ( $error_msg , DB_ERROR_LOG_FILE );
?>

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

Обратно към “Заявки за плъгини”

Кой е на линия

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