Перейти к содержанию
Авторизация  
desolator

Проверка На Символы В Нике.

Рекомендуемые сообщения

В общем есть такое чудо на питоне как Shadow_name - сервис в донейт шопе для смены ника.

 

import sys
from java.lang import System
from java.util import Iterator
from ru.catssoftware import L2DatabaseFactory
from ru.catssoftware.tools.random import Rnd
from ru.catssoftware.gameserver.model.quest import State
from ru.catssoftware.gameserver.model.quest import QuestState
from ru.catssoftware.gameserver.model.quest.jython import QuestJython as JQuest
from time import gmtime, strftime

qn = "1235_ShadowName"

print "***Donate Manager by TigloN, Name - Loaded***"

NPC = 298030
ITEM = 13012 # итем необходимый для обмена
COST = 15 # стоимость
INAME = "Донат монет" # название итема

class Quest (JQuest) :

def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)

def onAdvEvent (self,event,npc,player):
st = player.getQuestState(qn)
if event == "step1":
 if st.getQuestItemsCount(ITEM) < COST:
 htmltext = "<html><body>Смена ника: <font color=74bff5>"+str(COST)+" "+INAME+"</font></body></html>"
 return htmltext
 #elif player.getClanId():
 #htmltext = "<html><body>Для смены ника вам необходимо выйти из клана<br>Вы сможете вступить вновь, сразу после смены ника<br>Если вы кланлидер - перекиньте клан на твинка</body></html>"
 #return htmltext
 htmltext = "<html><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><img src=\"L2UI.SquareBlank\" width=260 height=2><br1>"	
 htmltext += "Введите желаемый ник:"
 htmltext += "<edit var=\"nick\" width=200 length=\"16\"><br>"
 htmltext += "<button value=\"Проверить\" action=\"bypass -h Quest 1235_ShadowName step2_ $nick\" width=204 height=20 back=\"sek.cbui36\" fore=\"sek.cbui75\"><br>"
 htmltext += "<img src=\"L2UI_CH3.herotower_deco\" width=256 height=32></center></body></html>"
elif event.startswith("step2_"):
 nick = str(event.replace("step2_", ""))
 nick = str(nick.replace(" ", ""))
 htmltext = "<html><body><center>Смена ника:<br>Проверка...<br><br>"
 if nick == "Administrator":
 htmltext += "Вы не ввели желаемый ник! Не используйте символы #$%^&_|<br><br>"
 htmltext += "<a action=\"bypass -h Quest 1235_ShadowName step1\">Вернуться.</a></body></html>"
 return htmltext
 elif nick.startswith("GM.") or nick.startswith("ADM.") or nick.startswith("EGM.") or nick.startswith("-") or nick.startswith(".") or nick.startswith("#") or nick.startswith("%") or nick.startswith("&") or nick.startswith("|"):
 htmltext += "Неправильный ник!<br><br>"
 htmltext += "<a action=\"bypass -h Quest 1235_ShadowName step1\">Вернуться.</a></body></html>"
 return htmltext
 elif nick.endswith(".GM") or nick.endswith(".ADM") or nick.endswith(".EGM") or nick.startswith("-") or nick.startswith(".") or nick.startswith("#") or nick.startswith("%") or nick.startswith("&") or nick.startswith("|"):
 htmltext += "Неправильный ник!<br><br>"
 htmltext += "<a action=\"bypass -h Quest 1235_ShadowName step1\">Вернуться.</a></body></html>"
 return htmltext
#<
 cona=L2DatabaseFactory.getInstance().getConnection()
 getcount=cona.prepareStatement("SELECT COUNT(char_name) FROM characters WHERE char_name=?")
 getcount.setString(1,nick)
 rsc=getcount.executeQuery()
 if (rsc.next()):
 if rsc.getInt(1) == 1:
	 htmltext = "<font color=dc143c>Ник "+nick+" уже занят.</font><br>"
	 htmltext += "<a action=\"bypass -h Quest 1235_ShadowName step1\">Вернуться.</a></body></html>"
	 return htmltext
 rsc.close()
 getcount.close()
 cona.close()
#<
 htmltext += "<font color=bef574>Ник "+nick+" свободен.</font><br>"
 htmltext += "<a action=\"bypass -h Quest 1235_ShadowName step3_"+nick+"\" msg=\"Новый ник "+nick+". Уверены?\">Продолжить. </a><br><br>"
 htmltext += "<a action=\"bypass -h Quest 1235_ShadowName step1\">Назад</a></body></html>"
elif event.startswith("step3"):
 nick = str(event.replace("step3_", ""))
 if st.getQuestItemsCount(ITEM) < COST:
 htmltext = "<html><body>Смена ника: <font color=74bff5>"+str(COST)+" "+INAME+"</font></center></body></html>"
 return htmltext
#<
 login = str(player.getAccountName())
 name = str(player.getName())
 date = str(strftime("%Y-%m-%d", gmtime()))
 time = str(strftime("%H:%M:%S", gmtime()))
 writelog=L2DatabaseFactory.getInstance().getConnection()
 write=writelog.prepareStatement("INSERT INTO zz_donate_log (date,time,login,name,action,payment) VALUES (?,?,?,?,?,?)")
 write.setString(1, date)
 write.setString(2, time)
 write.setString(3, login)
 write.setString(4, name)
 write.setString(5, "Nick: "+nick+"")
 write.setInt(6, COST)
 try :
 write.executeUpdate()
 write.close()
 writelog.close()
 except :
 try : writelog.close()
 except : pass
#<
 player.setName(nick)
 st.takeItems(ITEM,COST)
 htmltext = "<html><body><center>Смена ника:<br>Готово.<br><font color=f5b974>Перезайдите!</font><br></body></html>"
else:
 htmltext = "<html><body>Смена ника:<br>Oops!</center></body></html>"
return htmltext

def onTalk (self,npc,player):
st = player.getQuestState(qn)
npcId = npc.getNpcId()
if npcId == NPC:
 self.startQuestTimer("step1",100,None,player)	
return

QUEST	 = Quest(1235,qn,"custom")

QUEST.addStartNpc(NPC)
QUEST.addTalkId(NPC)

 

 

 

У этого чуда есть проверка на символы в ник нейме т.е. есть в начале ника символ # если да - возвращаем назад.

Вот этот кусок кода:

htmltext = "<html><body><center>Смена ника:<br>Проверка...<br><br>"
if nick == "":
htmltext += "Вы не ввели желаемый ник! Не используйте символы #$%^&_|<br><br>"
htmltext += "<a action=\"bypass -h Quest 1235_ShadowName step1\">Вернуться.</a></body></html>"
return htmltext
elif nick.startswith("GM.") or nick.startswith("ADM.") or nick.startswith("EGM.") or nick.startswith("-") or nick.startswith(".") or nick.startswith("#") or nick.startswith("%") or nick.startswith("&") or nick.startswith("|"):
htmltext += "Неправильный ник!<br><br>"
htmltext += "<a action=\"bypass -h Quest 1235_ShadowName step1\">Вернуться.</a></body></html>"
return htmltext
elif nick.endswith(".GM") or nick.endswith(".ADM") or nick.endswith(".EGM") or nick.startswith("-") or nick.startswith(".") or nick.startswith("#") or nick.startswith("%") or nick.startswith("&") or nick.startswith("|"):
htmltext += "Неправильный ник!<br><br>"
htmltext += "<a action=\"bypass -h Quest 1235_ShadowName step1\">Вернуться.</a></body></html>"
return htmltext

elif nick.startswith - проверка на символы в начале ника. elif nick.endswith - проверка на символы в конце ника.

 

После того как я ввожу n-oe кл-во раз неверный ник т.е. недопустимый. Меня дропает с сервера вот под таким предлогом

 [iNFO 23:01:18]: AUDIT:[L2PcInstance] player [%^%^%] sent invalid bypass 'Quest 1235_ShadowName step2_',player %^%^% 2

%^%^% - это никнейм который я ввожу, а гс считает что это очень большая трагедия игрок читерит - не верный байпасс и т.п. в последствии дропает меня.

Сборка l2jlovely. Вопрос: Почему он меня дропает и как фиксить?

Спасибо за внимание.

Изменено пользователем desolator

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может добавить or nick.startswith("^"):

elif nick.endswith(".GM") or nick.endswith(".ADM") or nick.endswith(".EGM") or nick.startswith("-") or nick.startswith(".") or nick.startswith("#") or nick.startswith("%") or nick.startswith("&") or nick.startswith("|"):

Изменено пользователем LifeGame32

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

глупо, ведь у меня в нике нету в начале либо в конце ^

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

глупо, ведь у меня в нике нету в начале либо в конце ^

А сделать Проверку startswith и endswith в одно логическое?

Будет не глупо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А сделать Проверку startswith и endswith в одно логическое?

Будет не глупо.

В один elif? Или что? Подробней распиши пожалуйста, а я пока погуглю каккодитьнапитоне ;[]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В один elif? Или что? Подробней распиши пожалуйста, а я пока погуглю каккодитьнапитоне ;[]

Да короче все переписывать нужно. Я хоть и не очень шарю в питоне но тут глаза поломать можно.

Конект к базе данных нужно зделать через функцию (убрать из def onAdvEvent)

 

И конечно серьезная ошибка ! Как я понял команда(step3) будет доступна если ввели правильный ник.

А теперь кто то там нехороший отправит через пакет хак команду (Пример: step3 Admin) и получит желаемый ник без проверок. ( elif event.startswith("step3"): )

Так делать не стоит!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мой тебе совет, завязывай с питоном:) Такое чудо на яве не составит труда по моему, тем более что есть уже пример на питоне:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да короче все переписывать нужно. Я хоть и не очень шарю в питоне но тут глаза поломать можно.

Конект к базе данных нужно зделать через функцию (убрать из def onAdvEvent)

 

И конечно серьезная ошибка ! Как я понял команда(step3) будет доступна если ввели правильный ник.

А теперь кто то там нехороший отправит через пакет хак команду (Пример: step3 Admin) и получит желаемый ник без проверок. ( elif event.startswith("step3"): )

Так делать не стоит!

Ну ник он получит только без проверок на символы, а вот итемы у него в любом случае заберет так как стоит же

if st.getQuestItemsCount(ITEM) < COST

Только вот оно даже по правильному не корректно работает эта чертова проверка на символы. Я бы её совсем убрал но без нее такие чудаса бд выдает в игру...

Изменено пользователем desolator

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

фу-фу-фу, не надо так делать=) Всё делается в 1 цикл и не нужно писать кучу проверок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Используй паттерны

public static boolean isMatchingRegexp(String text, String template)
       {
               Pattern pattern = null;
               try
               {
                       pattern = Pattern.compile(template);
               }
               catch(PatternSyntaxException e) // invalid template
               {
                       e.printStackTrace();
               }
               if(pattern == null)
                       return false;
               Matcher regexp = pattern.matcher(text);
               return regexp.matches();
       }

if (!(isMatchingRegexp(st1, "[0-9]")) как пример

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...