SK
pedido

Ajuda com query(players vip)

Por Skymagnum, 28 de out. de 2015 em Scripts

resolvido
script
9
1.8k
SkymagnumS
28 de outubro de 2015 às 20:24

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
AntharazA
28 de outubro de 2015 às 20:55

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.

SkymagnumS
28 de outubro de 2015 às 21:31

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 Outubro 28 por Skymagnum

AntharazA
28 de outubro de 2015 às 22:36

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?

SkymagnumS
28 de outubro de 2015 às 22:49

Gesior

AntharazA
29 de outubro de 2015 às 02:21

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. :)

SkymagnumS
29 de outubro de 2015 às 20:58

Ok obrigado, eu uso por storage 13540 a storage dele.

AntharazA
31 de outubro de 2015 às 04:52
Melhor resposta

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 Outubro 31 por Antharaz

DanihcvD
01 de novembro de 2015 às 17:15

Tópico movido para dúvidas / pedidos resolvidos.