AMXX с исходниками SMA для продажи флагов доступа

Серверная сборка от проекта

Модератор: Админ CS 1.6

Аватара пользователя
Online
Разработчик
Разработчик
Сообщения: 1702
Зарегистрирован: 19 ноя 2009, 17:59
Откуда: Беларусь
Контактная информация:

AMXX с исходниками SMA для продажи флагов доступа

Непрочитанное сообщение Online » 18 июн 2014, 16:13

Если Вы не используете плагины AMXBans, Вам эта статья не нужна, потому что в стандартном плагине выдачи флагов по протоколу RCON всё замечательно работает, пишите amx_addadmin и читайте описание команды.

Понадобилась реализация продажи флагов на серверах Counter-Strike 1.6. Как обычно думаю пропишу через RCON команду amx_addadmin и не тут то было, когда я попробовал её вводить на разных версиях плагина AMXBans, сервер молча ни чего не хотел выдавать.

Тогда я решил открыть исходный код плагина и поискать какие-нибудь упоминания об добавлении администраторов через RCON консоль управления серверами Counter-Strike 1.6. Таких функций там не окозалось, только в старой пятой версии я нашёл закомментированный кусок кода.

Код: Выделить всё

//register_concmd("amx_addadmin", "addadminfn"...
В следующих версиях плагина AMXBans и этот не большой комментарий был удалён и я решил самостоятельно дописать AMXX плагин для выдачи флагов и привилегий через протокол RCON, чтобы можно было продавать их через магазины CMS Minecraft Shop.

Продажа флагов доступа для плагинов AMXBans по протоколу RCON
Для самостоятельной компиляции плагинов.

Открываем исходник: cstrike\addons\amxmodx\scripting\amxbans_core.sma
Находим код:

Код: Выделить всё

	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 database")
В любое место вставляем код:

Код: Выделить всё


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, 15)
      
      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", PREFIX, t_arg)
		return PLUGIN_HANDLED
      }
   }

   new arg[33]
   read_argv(1, arg, 32)
   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[32], _num, _pv
         get_players(_players, _num)
         for (new _i=0; _i<_num; _i++)
         {
            _pv = _players[_i]
            get_user_authid(_pv, _steamid, sizeof(_steamid)-1)
            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, 63)

   new password[64]
   if (read_argc() >= 4)
      read_argv(3, password, 63)

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

   if (player > 0)
   {
      new name[32]
      get_user_info(player, "name", name, 31)
      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, 127)
   
   if (sql == Empty_Handle)
   {
      server_print("[VPN.BY] %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, 63)
      format(configsDir, 63, "%s/users.ini", configsDir)

      if (!file_exists(configsDir))
      {
         console_print(id, "%s File ^"%s^" doesn't exist.", PREFIX, 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, 255, 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 users.ini already exists!", PREFIX, auth)
            return
         }
      }

      // If we came here, steamid doesn't exist in users.ini. Add it.
      new linetoadd[512]
      
      if (comment[0]==0)
      {
         formatex(linetoadd, 511, "^r^n^"%s^" ^"%s^" ^"%s^" ^"%s^"", auth, password, accessflags, flags)
      }
      else
      {
         formatex(linetoadd, 511, "^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!", PREFIX, configsDir)
#if defined USING_SQL
   }

   new Handle:query = SQL_PrepareQuery(sql, "SELECT `id` FROM `amx_amxadmins` WHERE (`steamid` = '%s') LIMIT 1", auth)

   if (!SQL_Execute(query))
   {
      SQL_QueryError(query, error, 127)
      server_print("[VPN.BY] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error)
      console_print(id, "[VPN.BY] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error)
   }
   else
   {
	console_print(id, "Adding to database:^n^"%s^" ^"%s^" ^"%s^" ^"%s^"", auth, password, accessflags, flags)

	query = SQL_PrepareQuery(sql, "INSERT INTO `amx_amxadmins` (`steamid`, `nickname`, `username`, `password`, `access`, `flags`, `created`, `expired`, `days`, `ashow`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP(NOW()) + 2937600, 34, 0) ON DUPLICATE KEY UPDATE `created` = UNIX_TIMESTAMP(NOW()),  `expired` = UNIX_TIMESTAMP(NOW()) + 2937600, `days` = 34, `access` = '%s'", auth, auth, auth, password, accessflags, flags, accessflags)
	if (!SQL_Execute(query))
	{
		SQL_QueryError(query, error, 127)
		server_print("[VPN.BY]", error)
		console_print(id, "[VPN.BY]", error)
	}
	else
	{
		query = SQL_PrepareQuery(sql, "SELECT `id` FROM `amx_amxadmins` WHERE (`steamid` = '%s') LIMIT 1", auth)
		if (!SQL_Execute(query))
		{
			SQL_QueryError(query, error, 127)
			server_print("[VPN.BY]", error)
			console_print(id, "[VPN.BY]", error)
		}
		else
		{
			new Handle:squery = SQL_PrepareQuery(sql, "SELECT `id` FROM `amx_serverinfo` WHERE `address` = '%s'", g_ServerAddr)
			if (!SQL_Execute(squery))
			{
				SQL_QueryError(query, error, 127)
				server_print("[VPN.BY]", error)
				console_print(id, "[VPN.BY]", error)
			}
			else
			{
				new admin_id[32]
				new server_id[32]
				new serv_id = SQL_FieldNameToNum(squery, "id")
				new adm_id = SQL_FieldNameToNum(query, "id")
				SQL_ReadResult(squery, serv_id, server_id, 32)
				SQL_ReadResult(query, adm_id, admin_id, 32)

				query = SQL_PrepareQuery(sql, "REPLACE INTO `amx_admins_servers` (`admin_id`, `server_id`, `custom_flags`, `use_static_bantime`) VALUES ('%s', '%s', '', 'yes')", admin_id, server_id)
				if (!SQL_Execute(query))
				{
					SQL_QueryError(query, error, 127)
					server_print("[VPN.BY]", error)
					console_print(id, "[VPN.BY]", error)
				}
			}
		}
	}
   }
   
   SQL_FreeHandle(query)
   SQL_FreeHandle(sql)
   SQL_FreeHandle(info)
#endif
}

Ответить

Вернуться в «Серверная сборка»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость