Ir para conteúdo
  • 0

Ajuda com query(players vip)


Skymagnum

Pergunta

Galera to precisando de uma query que deleta players.

 

Exemplo: Tem um cara com nome de [VIP] Testinho, ai quando eu executar a query se tiver com alguem com o nome de Testinho sera deletado.

 

Eu estou usando isso por enquanto.

 

 

for _,pid in ipairs(getPlayersOnline()) do
if string.find(getCreatureName(pid), "[Vip]") then
db.query("DELETE FROM `players` WHERE `name` = " .. string.sub(getCreatureName(pid), 7))
end
end
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

O problema deste é que só funciona se o vip estiver online né... provavelmente você tem uma table somente com os vips ou então uma coluna na table players que indica se é vip ou não, a partir daí, vc manda filtrar todos que estão marcados como vip na tabela, depois manipula a string do nome retirando o [VIP] e deleta quando achar alguém com esse nome.

 

Para evitar futuros problemas como este, você poderia criar uma regra no gesior que quando procura se já existe alguém com este nome, verifica também se existe alguém com "[VIP] " + o nome, eu não posso fazer isto agora, mas te dei um caminho, lá para as 22h entro denovo aqui e boto a mão na massa se ainda estiver aberto o tópico. Qualquer coisa me manda PM.

Link para o comentário
Compartilhar em outros sites

  • 0

Já criei outro aqui, não é o melhor mas por enquanto vou usar até alguém comentar a query, uso sistema de vip por storage.


function onLogin(cid)
local subName = string.sub(getCreatureName(cid), 7)
if string.find(getCreatureName(cid), "[Vip]") then
if playerExists(subName) then
db.query("DELETE FROM `players` WHERE `name` = " .. subName)
end
end
return true
end
Editado por Skymagnum
Link para o comentário
Compartilhar em outros sites

  • 0

Estou fazendo as modificações no site para não conseguirem criar chars com mesmo nome de quem já tem "[VIP]", mas gostaria de saber qual sistema do seu site, gesior, modernacc, ou qual?

Link para o comentário
Compartilhar em outros sites

  • 0

Vamos por parte, primeiro iremos fazer com que fique escrito "Player with this name already exist." quando usado o mesmo nome que um vip embaixo da box de onde se digita o nome. Para isto você irá abrir o arquivo check_name.php localizado na pasta htdocs\ajax do seu site e substituir esta parte:

		if($server_config['sqlType'] == "mysql")
			$ots->connect(POT::DB_MYSQL, array('host' => $mysqlhost, 'user' => $mysqluser, 'password' => $mysqlpass, 'database' => $mysqldatabase) );
		elseif($server_config['sqlType'] == "sqlite")
			$ots->connect(POT::DB_SQLITE, array('database' => $config_ini['server_path'].$sqlitefile));
		$name_db = new OTS_Player();
		$name_db->find($name);
		if($name_db->isLoaded())
			echo '<font color="red"><b>Player with this name already exist.</b></font>';
		else
			echo '<font color="green">Good. Your name will be:<br />"<b>'.ucwords($name).'</b>"</font>';

?>

Por esta:

		if($server_config['sqlType'] == "mysql")
			$ots->connect(POT::DB_MYSQL, array('host' => $mysqlhost, 'user' => $mysqluser, 'password' => $mysqlpass, 'database' => $mysqldatabase) );
		elseif($server_config['sqlType'] == "sqlite")
			$ots->connect(POT::DB_SQLITE, array('database' => $config_ini['server_path'].$sqlitefile));
		$name_db = new OTS_Player();
		$name_db->find($name);
		$name_db2 = new OTS_Player();
		$name_db2->find('[VIP] '.$name);
		if(($name_db->isLoaded()) or ($name_db2->isLoaded()))
			echo '<font color="red"><b>Player with this name already exist.</b></font>';
		else
			echo '<font color="green">Good. Your name will be:<br />"<b>'.ucwords($name).'</b>"</font>';

?>

Só isto não basta, pois esta é uma menssagem temporária que o site passa para o visitante, se ele clicar em "submit" ele conseguirá criar o char. Para evitarmos isto, vá na pasta htdocs e abra o arquivo accountmanagement.php, lá você substituirá esta parte:

                                if(empty($newchar_errors))
                                {
                                        $check_name_in_database = $ots->createObject('Player');
                                        $check_name_in_database->find($newchar_name);
                                        if($check_name_in_database->isLoaded())
                                                $newchar_errors[] .= 'This name is already used. Please choose another name!';
                                        $number_of_players_on_account = $account_logged->getPlayersList()->count();
                                        if($number_of_players_on_account >= $config['site']['max_players_per_account'])
                                                $newchar_errors[] .= 'You have too many characters on your account <b>('.$number_of_players_on_account.'/'.$config['site']['max_players_per_account'].')</b>!';
                                }

Por esta:

                                if(empty($newchar_errors))
                                {
                                        $check_name_in_database = $ots->createObject('Player');
                                        $check_name_in_database->find($newchar_name);
                                        if($check_name_in_database->isLoaded())
                                                $newchar_errors[] .= 'This name is already used. Please choose another name!';
					$check_name_in_database->find('[VIP] '.$newchar_name);
                                        if($check_name_in_database->isLoaded())
                                                $newchar_errors[] .= 'This name is already used. Please choose another name!';
                                        $number_of_players_on_account = $account_logged->getPlayersList()->count();
                                        if($number_of_players_on_account >= $config['site']['max_players_per_account'])
                                                $newchar_errors[] .= 'You have too many characters on your account <b>('.$number_of_players_on_account.'/'.$config['site']['max_players_per_account'].')</b>!';
                                }

Assim o player ficará impossibilitado de criar um char com o nome de algum vip e evitará todos seus problemas. Para finalizar, basta remover todos os players que já tem nome de vips da sua database, para isto fiz uma query que você irá executar apenas uma vez, visto que após modificar o site não terá como eles abusarem disto novamente, porém eu necessitaria saber qual seu sistema de vip para fazer isto, se é por database, por storage e quais as tabelas com colunas ou storages que se usa.

 

Aguardo retorno. :)

Link para o comentário
Compartilhar em outros sites

  • 0

Mil perdões, achei que eu já havia postado o script para você, segue abaixo o script que exclui todos players que tem os mesmos nomes dos vips, independente se estiver online ou não. Eu usei em talkaction pois com a modificação no site, você só precisa retirar os que já tem.

 

Eu supus que o player vip tem o storage 13540 maior ou igual a 1.

 

Versão mysql:

function onSay(cid, words, param, channel)
	local nomes,res = {},db.getResult("SELECT `player_id` FROM `player_storage` WHERE `value` >= 1 AND `key` = 13540;")
	if(res:getID() ~= -1) then
		repeat
			local id = res:getDataInt("player_id")
			local res2 = db.getResult("SELECT `name` FROM `players` WHERE `id`  = "..id..";")
			if(res2:getID() ~= -1) then
				table.insert(nomes,res2:getDataString("name"))
			end
		until not(res:next())
		for a,b in ipairs(nomes) do
			b = string.sub(b, 7)
			db.query("DELETE FROM `players` WHERE `name`  = `"..b.."`;")
		end
	end
	return true
end

Versão SQLite:

function onSay(cid, words, param, channel)
	local nomes,res = {},db.getResult("SELECT `player_storage`.`player_id` FROM `player_storage` WHERE `player_storage`.`value` >= 1 AND `player_storage`.`key` = 13540;")
	if(res:getID() ~= -1) then
		repeat
			local id = res:getDataInt("player_id")
			local res2 = db.getResult("SELECT `players`.`name` FROM `players` WHERE `players`.`id`  = "..id..";")
			if(res2:getID() ~= -1) then
				table.insert(nomes,res2:getDataString("name"))
			end
		until not(res:next())
		for a,b in ipairs(nomes) do
			b = string.sub(b, 7)
			db.query("DELETE FROM `players` WHERE `players`.`name`  = `"..b.."`;")
		end
	end
	return true
end
Editado por Antharaz
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...