Ekspoint 2,120 Posted March 15, 2015 Нужно сделать поддержку других ссылок в центре уведомлений кликабельно ( можно и с привязкой xvm) Quote Share this post Link to post Short link Share on other sites
woole 5 #258169 Posted March 15, 2015 Тоже интересно. Но там только через флеш можно, кажется Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,904 #258171 Posted March 15, 2015 (edited) Нужно сделать поддержку других ссылок в центре уведомлений кликабельно ( можно и с привязкой xvm) Перекомпилить xvm_svcmsg.as3proj, внеся .split с нужным адресом здесь: src>xvm>svcmsg>ServiceMessageXvmView.as: { value.messageVO.message = message .split("#XVM_SITE#") .join('event:http://www.modxvm.com/#wot-main') .split("#XVM_SITE_DL#") .join('event:http://www.modxvm.com/%d1%81%d0%ba%d0%b0%d1%87%d0%b0%d1%82%d1%8c-xvm/#wot-main') .split("#XVM_SITE_UNAVAILABLE#") .join('event:http://www.modxvm.com/%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D1%8B%D0%B5-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B-%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D1%8B/#wot-main') .split("#XVM_SITE_INACTIVE#") .join('event:http://www.modxvm.com/%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D1%8B%D0%B5-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B-xvm/#wot-main') .split("#XVM_SITE_BLOCKED#") .join('event:http://www.modxvm.com/%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81-%D0%B7%D0%B0%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD/#wot-main'); } else { value.messageVO.message = message .split("#XVM_SITE#") .join('event:http://www.modxvm.com/en/#wot-main') .split("#XVM_SITE_DL#") .join('event:http://www.modxvm.com/en/download-xvm/#wot-main') .split("#XVM_SITE_UNAVAILABLE#") .join('event:http://www.modxvm.com/en/network-services-unavailable/#wot-main') .split("#XVM_SITE_INACTIVE#") .join('event:http://www.modxvm.com/en/network-services-xvm/#wot-main') .split("#XVM_SITE_BLOCKED#") .join('event:http://www.modxvm.com/en/status-blocked/#wot-main'); } //Logger.addObject(value.messageVO); } И тогда можно будет в системном канале сделать кликабельную ссылку. Edited March 15, 2015 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,120 #258173 Posted March 15, 2015 Перекомпилить xvm_svcmsg.as3proj, внеся .split с нужным адресом здесь: src>xvm>svcmsg>ServiceMessageXvmView.as: { value.messageVO.message = message .split("#XVM_SITE#") .join('event:http://www.modxvm.com/#wot-main') .split("#XVM_SITE_DL#") .join('event:http://www.modxvm.com/%d1%81%d0%ba%d0%b0%d1%87%d0%b0%d1%82%d1%8c-xvm/#wot-main') .split("#XVM_SITE_UNAVAILABLE#") .join('event:http://www.modxvm.com/%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D1%8B%D0%B5-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B-%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D1%8B/#wot-main') .split("#XVM_SITE_INACTIVE#") .join('event:http://www.modxvm.com/%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D1%8B%D0%B5-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B-xvm/#wot-main') .split("#XVM_SITE_BLOCKED#") .join('event:http://www.modxvm.com/%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81-%D0%B7%D0%B0%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD/#wot-main'); } else { value.messageVO.message = message .split("#XVM_SITE#") .join('event:http://www.modxvm.com/en/#wot-main') .split("#XVM_SITE_DL#") .join('event:http://www.modxvm.com/en/download-xvm/#wot-main') .split("#XVM_SITE_UNAVAILABLE#") .join('event:http://www.modxvm.com/en/network-services-unavailable/#wot-main') .split("#XVM_SITE_INACTIVE#") .join('event:http://www.modxvm.com/en/network-services-xvm/#wot-main') .split("#XVM_SITE_BLOCKED#") .join('event:http://www.modxvm.com/en/status-blocked/#wot-main'); } //Logger.addObject(value.messageVO); } И тогда можно будет в системном канале сделать кликабельную ссылку. Это исходник, а в готовом как? Quote Share this post Link to post Short link Share on other sites
AtotIK 569 #258181 Posted March 15, 2015 Через питон же можно всё сделать... Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,120 #258183 Posted March 15, 2015 Через питон же можно всё сделать... и как же? пример можно? Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,904 #258209 Posted March 15, 2015 Это исходник, а в готовом как? Никак. Через питон же можно всё сделать... Написал, что знаю) Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,120 #258261 Posted March 15, 2015 Никак. Написал, что знаю) так как через питон? Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #259184 Posted March 20, 2015 Ночь за компом, скрипты скрипты скрипты и под утро .... способ есть, на питоне, всего 2 строчки и урл в сообщениях работают, без перекомпиляции других скриптов, флешей и тд, просто свой мод в несколько строк 100% на питоне способ есть и рабочий Нужно отблагодарить себя чекуней, ураааа 2 1 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,904 #259185 Posted March 20, 2015 (edited) @Megagrob, пример можно?) Edited March 20, 2015 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #259194 Posted March 20, 2015 (edited) @Megagrob, пример можно?) Kotyarko_O, в лс Edited March 20, 2015 by Megagrob Quote Share this post Link to post Short link Share on other sites
woole 5 #259202 Posted March 20, 2015 Ночь за компом, скрипты скрипты скрипты и под утро .... способ есть, на питоне, всего 2 строчки и урл в сообщениях работают, без перекомпиляции других скриптов, флешей и тд, просто свой мод в несколько строк 100% на питоне способ есть и рабочий Нужно отблагодарить себя чекуней, ураааа mod.jpg А теперь поделись секретом, пожалуйста :) Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,120 #259210 Posted March 20, 2015 Ночь за компом, скрипты скрипты скрипты и под утро .... способ есть, на питоне, всего 2 строчки и урл в сообщениях работают, без перекомпиляции других скриптов, флешей и тд, просто свой мод в несколько строк 100% на питоне способ есть и рабочий Нужно отблагодарить себя чекуней, ураааа mod.jpg Примерчик :) Megagrob, в лс написал Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #259220 Posted March 20, 2015 (edited) del Edited April 27, 2015 by Megagrob 9 Quote Share this post Link to post Short link Share on other sites
GPCracker 2,086 #263095 Posted April 18, 2015 Делюсь способом взамен на методы вывода передвигаемых :) окон (диалоги уже умею), кнопок, исходник апдейтера типа Notification Box, стрим информер, подтверждения типа принятия во взвод и тд, тоесть различные формы. Например исходник мода вывода произвольной информации в окно, и кнопка к нему. Вывод сообщений в ангере и в бою уже знаю, ну разве что вывод gui элементов (текст, графика) в бою (кое что знаю, но может что новое) Интересуют исходники модов аналогичные модам ПРОТанки, или они сами.Тут немного по-другому все происходит - ты помогаешь людям, люди помогают тебе. Хотя если честно, я сомневаюсь в том, что можно сделать кликабельной ссылку в 2 строчки. Если клиент чистый (не установлен XVM, c ним проще -> <a href="event:http://www.google.ru/">Google</a>), то все не так просто (я во флеше и ActionScript не шарю, так что прошу не закидывать меня помидорами) Эвент клика по ссылке дропается обработчиком А вот этот обработчик устанавливается this.list.addEventListener(ServiceMessageEvent.MESSAGE_LINK_CLICKED, this.messageLinkClickHandler, false, 0, true); (со стороны питона - scripts/client/notification/NotificationListView.py)Вот это, насколько я понимаю, вызов события? Примерно то же самое делается в XVM Ладно посмотрим, куда это событие выходит: onSecuritySettingsLinkClickS();Интерфейс: Класс со стороны питона найти не удалось( Мета-класс Питон scripts/client/gui/Scaleform/daapi/view/meta/NotificationsListMeta.py А вот и самое интересное: функция onSecuritySettingsLinkClick объявлена как публичная переменная - она написана уже не на флеше, а подтягивается от питона! Из того самого мета-класса. Правда она перегружается в основном классе (scripts/client/notification/NotificationListView.py). Алгоритм всего этого до конца я еще не вкурил, но очевидно одно - просто так без патча флеша ссылку кликабельной не сделать. Ну а если патчить, то там можно либо напрямую из флеша браузер запустить (не уверен, что можно), либо аналогичным образом пробросить эвент через DAAPI и обработать на питоне. Я конечно не отрицаю каких-то альтернативных путей, но то что в классах NotificationList*** в питоне без патча флеша ловить нечего, это очевидно. А поскольку эти классы определены в Application.swf, то патчить скрипты непосредственно флешки, отвечающей за системные сообщения бесполезно, патчить нужно именно Application.swf... А replace-patch не самая крутая идея, поскольку возможны конфликты между модами на уровне замены файла / очередном обновлении от картохи. 4 Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #265852 Posted April 27, 2015 (edited) Прошу сильно не пинать и не ржать, если что, я ж не гуру ;)Итак...Если установлен XVM то проблем нет. Нужно правильно прописать ссылку через event: <a href="event:http://worldoftanks.ru/">Танки</a> или с помощью функции makeHtmlString link = makeHtmlString('html_templates:lobby/system_messages', 'link', {'text': 'Танки', 'linkType': 'http://worldoftanks.ru/'}) Вывести это дело с помощью SystemMessages.pushMessage() 'Примеры вывода:' import BigWorld from gui import SystemMessages, makeHtmlString linkText1 = 'Танки' linkURL1 = 'http://worldoftanks.ru/' linkText2 = 'Самолёты' linkURL2 = 'http://worldofwarplanes.ru/' linkText3 = 'Корабли' linkURL3 = 'http://worldofwarships.ru/' #linkURL3 = 'http://localhost/%D0%BF%D1%80%D0%BE%D0%B1%D0%B0' link1 = makeHtmlString('html_templates:lobby/system_messages', 'link', {'text': linkText1, 'linkType': linkURL1}) link2 = makeHtmlString('html_templates:lobby/system_messages', 'link', {'text': linkText2, 'linkType': linkURL2}) link3 = makeHtmlString('html_templates:lobby/system_messages', 'link', {'text': linkText3, 'linkType': linkURL3}) SystemMessages.pushMessage('Привет, ' + BigWorld.player().name + '!\n' + link1 + '\n' + link2 + '\n' + link3, type=SystemMessages.SM_TYPE.GameGreeting) #SystemMessages.pushMessage(makeHtmlString('html_templates:lobby/system_messages', 'link', {'text': 'Танки', 'linkType': 'http://worldoftanks.ru/'}), type=SystemMessages.SM_TYPE.Warning) #SystemMessages.pushMessage('<a href="event:http://worldofwarplanes.ru/">Самолёты</a>', type=SystemMessages.SM_TYPE.GameGreeting) # SystemMessages.SM_TYPE.типы ниже, в скобках выводимая иконка # ----- # Error - Ошибка (-) # Warning - Внимание (!) # Information - Информация (всплывашка не выводится) (i) # GameGreeting - Письмо (конверт) # PowerLevel - Исследовано (исслед?) # FinancialTransactionWithGold - Финансовая операция (голда) # FinancialTransactionWithCredits - Финансовая операция (кредиты) # FortificationStartUp - СтартАп (подарок) # PurchaseForGold - Куплено (голда) # PurchaseForCredits - Куплено (кредиты) # DismantlingForGold - Демонтировано (голда) # Selling - Продано (всплывашка не выводится) (кредиты) # Remove - Удаление из Ангара (всплывашка не выводится) (кредиты) # Repair - Ремонт (всплывашка не выводится) (кредиты) # CustomizationForGold - Кастомизация (голда) # CustomizationForCredits - Кастомизация (кредиты) Если чистый клиент, то всё сложнее. Нестандартный вариант (это даже не мод, так, фиксик файлика) предлагаю такой: Клиент, при клике по НАШЕЙ ссылке в системном канале, передаёт actionName в функцию handleAction(), и если имя не прописано в движке, то нифига и не происходит. Вываливается ошибка что такого Action нет. ERROR(scripts/client/notification/actions_handlers.py, 579): Action handler not found (1, 3L, 'http://worldoftanks.ru/') Так вот ActionName, при клике по ссылке, является самой ссылкой, ну к примеру http://worldoftanks.ru/. Дело за малым, провести проверку что это действительно урл (пусть просто по наличию http(s)), ну и потом BigWorld.wg_openWebBrowser(actionName) или g_eventBus.handleEvent(events.OpenLinkEvent(events.OpenLinkEvent.SPECIFIED, actionName)) Чем эти способы отличаются, как-то не разобрался. Но и тот и тот работает. ActionName ловим в scripts/client/notification/actions_handlers.pyc. 'Делаем обработку actionName --- actions_handlers.pyc --- v9.7' #добавить import os, string class NotificationsActionsHandlers(object): __slots__ = ('__single', '__multi') def __init__(self, handlers = None): super(NotificationsActionsHandlers, self).__init__() self.__single = {} self.__multi = defaultdict(set) if not handlers: handlers = _AVAILABLE_HANDLERS for clazz in handlers: actions = clazz.getActions() if actions: if len(actions) == 1: self.__single[clazz.getNotType(), actions[0]] = clazz else: LOG_ERROR('Handler is not added to collection', clazz) else: self.__multi[clazz.getNotType()].add(clazz) def handleAction(self, model, typeID, entityID, actionName): key = (typeID, actionName) if key in self.__single: clazz = self.__single[key] clazz().handleAction(model, entityID, actionName) elif typeID in self.__multi: for clazz in self.__multi[typeID]: clazz().handleAction(model, entityID, actionName) else: ################## Начало говнокода if actionName.lower().find('http://') or actionName.lower().find('https://'): #проверка на xvm_svcmsg xvm_svcmsg_ex = os.path.exists('res_mods/mods/packages/xvm_svcmsg/actionscript/xvm_svcmsg.swf') if not xvm_svcmsg_ex: BigWorld.wg_openWebBrowser(actionName) #другой вариант #g_eventBus.handleEvent(events.OpenLinkEvent(events.OpenLinkEvent.SPECIFIED, actionName)) else: pass else: LOG_ERROR('Action handler not found', typeID, entityID, actionName) ################## Конец говнокода def cleanUp(self): self.__single.clear() self.__multi.clear() Проверка на ХВМ делается чтобы исключить повтор срабатывания ссылки, когда открываются 2 вкладки браузера, и от фикса и от XVM. Можно её убрать, но тогда нужно физически убирать наш actions_handlers.pyc, если используется XVM. Со стороны XVM за открытие ссылок центра уведомления отвечает res_mods/mods/packages/xvm_svcmsg/actionscript/xvm_svcmsg.swf. Потому и сделал проверку только на один файл, хотя может стоит проверять всю папку XVM. Но проверка по наличию файлов как-то неочень, вот знать бы работает ли сам ХВМ, и конкретно модуль xvm_svcmsg. Как проверять запущен ли ХВМ, не нашёл. В самом ХВМ вроде тоже нет статуса, что он запущен, только нашёл получение списка модулей, но тоже с диска: mods = XfwView(View).getMods() 'Результат:' ['res_mods/mods/packages/xvm_autologin/actionscript/xvm_autologin.swf', 'res_mods/mods/packages/xvm_clock/actionscript/xvm_clock.swf', 'res_mods/mods/packages/xvm_company/actionscript/xvm_company.swf', 'res_mods/mods/packages/xvm_contacts/actionscript/xvm_contacts.swf', 'res_mods/mods/packages/xvm_crew/actionscript/xvm_crew.swf', 'res_mods/mods/packages/xvm_hangar/actionscript/xvm_hangar.swf', 'res_mods/mods/packages/xvm_limits/actionscript/xvm_limits.swf', 'res_mods/mods/packages/xvm_loginlayout/actionscript/xvm_loginlayout.swf', 'res_mods/mods/packages/xvm_main/actionscript/xvm_main.swf', 'res_mods/mods/packages/xvm_ping/actionscript/xvm_ping.swf', 'res_mods/mods/packages/xvm_profile/actionscript/xvm_profile.swf', 'res_mods/mods/packages/xvm_quests/actionscript/xvm_quests.swf', 'res_mods/mods/packages/xvm_squad/actionscript/xvm_squad.swf', 'res_mods/mods/packages/xvm_svcmsg/actionscript/xvm_svcmsg.swf', 'res_mods/mods/packages/xvm_tcarousel/actionscript/xvm_tcarousel.swf', 'res_mods/mods/packages/xvm_techtree/actionscript/xvm_techtree.swf', 'res_mods/mods/packages/xvm_widgets/actionscript/xvm_widgets.swf'] В варианте, который дан выше, ссылки должны правильно работать и на чистом клиенте, и с модами, и с модами + XVM. Ну наверное ;) В ЛЮБОМ СЛУЧАЕ ССЫЛКИ ДОЛЖНЫ БЫТЬ ПРАВИЛЬНО ОФОРМЛЕНЫ!!! (смотрите начало поста - 'event:http://' либо makeHtmlString) ПС: Может где и вылезет ошибка в движке, кто знает на что фикс может повлиять. Но я пока проблем не заметил. Кто может доработать качественно, тому респект и уважуха.ПСПС: В архиве изменённый actions_handlers.pyc, а в папке src - исходник и примеры вывода сообщений. sysmessage_links.zip Edited April 27, 2015 by Megagrob 4 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,904 #265862 Posted April 27, 2015 @Megagrob, большое спасибо :) Quote Share this post Link to post Short link Share on other sites
Megagrob 5 #265956 Posted April 27, 2015 @Megagrob, большое спасибо :) та не за что Потестите на ошибки в работе клиента, может где глюки появились Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,904 #265989 Posted April 27, 2015 Потестите на ошибки в работе клиента, может где глюки появились Всё ровно. Сколько кликал (как на чистом клиенте, так и с установленным на него XVM`ом) - всё нормально. В логе обычный ВГшный срач, или как там это называется) Quote Share this post Link to post Short link Share on other sites
GPCracker 2,086 #266099 Posted April 27, 2015 Кто может доработать качественно, тому респект и уважуха.Вместо переопределения класса можно сделать хук. Для тех, кто в танке - компилится отдельным файлом, кидается в папку со скриптами (scripts/client/mods). Не забываем загрузчики. В приложенном архиве исходник и скомпилированная версия.ClickLink.zip def new_NotificationsActionsHandlers_handleAction(self, model, typeID, entityID, actionName): import sys, re regex = re.compile( r'^https?://' r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' r'(?::\d+)?' r'(?:/?|[/?]\S+)$', re.IGNORECASE ) if regex.match(actionName) is None: return old_NotificationsActionsHandlers_handleAction(self, model, typeID, entityID, actionName) if 'xfw' not in sys.modules: from gui.shared import g_eventBus, events g_eventBus.handleEvent(events.OpenLinkEvent(events.OpenLinkEvent.SPECIFIED, actionName)) return None from notification.actions_handlers import NotificationsActionsHandlers old_NotificationsActionsHandlers_handleAction = NotificationsActionsHandlers.handleAction NotificationsActionsHandlers.handleAction = new_NotificationsActionsHandlers_handleAction 4 Quote Share this post Link to post Short link Share on other sites