desolator 267 Опубликовано 27 февраля, 2014 (изменено) В общем есть такое чудо на питоне как 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. Вопрос: Почему он меня дропает и как фиксить? Спасибо за внимание. Изменено 27 февраля, 2014 пользователем desolator Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LifeGame32 312 Опубликовано 27 февраля, 2014 (изменено) Может добавить 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("|"): Изменено 27 февраля, 2014 пользователем LifeGame32 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
desolator 267 Опубликовано 27 февраля, 2014 глупо, ведь у меня в нике нету в начале либо в конце ^ Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LifeGame32 312 Опубликовано 28 февраля, 2014 глупо, ведь у меня в нике нету в начале либо в конце ^ А сделать Проверку startswith и endswith в одно логическое? Будет не глупо. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
desolator 267 Опубликовано 28 февраля, 2014 А сделать Проверку startswith и endswith в одно логическое? Будет не глупо. В один elif? Или что? Подробней распиши пожалуйста, а я пока погуглю каккодитьнапитоне ;[] Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LifeGame32 312 Опубликовано 28 февраля, 2014 В один elif? Или что? Подробней распиши пожалуйста, а я пока погуглю каккодитьнапитоне ;[] Да короче все переписывать нужно. Я хоть и не очень шарю в питоне но тут глаза поломать можно. Конект к базе данных нужно зделать через функцию (убрать из def onAdvEvent) И конечно серьезная ошибка ! Как я понял команда(step3) будет доступна если ввели правильный ник. А теперь кто то там нехороший отправит через пакет хак команду (Пример: step3 Admin) и получит желаемый ник без проверок. ( elif event.startswith("step3"): ) Так делать не стоит! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
TrueMan 742 Опубликовано 28 февраля, 2014 Мой тебе совет, завязывай с питоном Такое чудо на яве не составит труда по моему, тем более что есть уже пример на питоне Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
desolator 267 Опубликовано 28 февраля, 2014 (изменено) Да короче все переписывать нужно. Я хоть и не очень шарю в питоне но тут глаза поломать можно. Конект к базе данных нужно зделать через функцию (убрать из def onAdvEvent) И конечно серьезная ошибка ! Как я понял команда(step3) будет доступна если ввели правильный ник. А теперь кто то там нехороший отправит через пакет хак команду (Пример: step3 Admin) и получит желаемый ник без проверок. ( elif event.startswith("step3"): ) Так делать не стоит! Ну ник он получит только без проверок на символы, а вот итемы у него в любом случае заберет так как стоит же if st.getQuestItemsCount(ITEM) < COST Только вот оно даже по правильному не корректно работает эта чертова проверка на символы. Я бы её совсем убрал но без нее такие чудаса бд выдает в игру... Изменено 28 февраля, 2014 пользователем desolator Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 4 марта, 2014 фу-фу-фу, не надо так делать=) Всё делается в 1 цикл и не нужно писать кучу проверок. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
dislike 302 Опубликовано 4 марта, 2014 Используй паттерны 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]")) как пример Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты