Ekspoint Posted March 15, 2015 Share Posted March 15, 2015 Нужно сделать поддержку других ссылок в центре уведомлений кликабельно ( можно и с привязкой xvm) @ Quote Link to comment Short link Share on other sites More sharing options...
woole Posted March 15, 2015 Share Posted March 15, 2015 Тоже интересно. Но там только через флеш можно, кажется @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted March 15, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted March 15, 2015 Author Share 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 Link to comment Short link Share on other sites More sharing options...
AtotIK Posted March 15, 2015 Share Posted March 15, 2015 Через питон же можно всё сделать... @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted March 15, 2015 Author Share Posted March 15, 2015 Через питон же можно всё сделать... и как же? пример можно? @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted March 15, 2015 Share Posted March 15, 2015 Это исходник, а в готовом как? Никак. Через питон же можно всё сделать... Написал, что знаю) @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted March 15, 2015 Author Share Posted March 15, 2015 Никак. Написал, что знаю) так как через питон? @ Quote Link to comment Short link Share on other sites More sharing options...
Megagrob Posted March 20, 2015 Share Posted March 20, 2015 Ночь за компом, скрипты скрипты скрипты и под утро .... способ есть, на питоне, всего 2 строчки и урл в сообщениях работают, без перекомпиляции других скриптов, флешей и тд, просто свой мод в несколько строк 100% на питоне способ есть и рабочий Нужно отблагодарить себя чекуней, ураааа 2 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted March 20, 2015 Share Posted March 20, 2015 (edited) @Megagrob, пример можно?) Edited March 20, 2015 by Kotyarko_O @ Quote Link to comment Short link Share on other sites More sharing options...
Megagrob Posted March 20, 2015 Share Posted March 20, 2015 (edited) @Megagrob, пример можно?) Kotyarko_O, в лс Edited March 20, 2015 by Megagrob @ Quote Link to comment Short link Share on other sites More sharing options...
woole Posted March 20, 2015 Share Posted March 20, 2015 Ночь за компом, скрипты скрипты скрипты и под утро .... способ есть, на питоне, всего 2 строчки и урл в сообщениях работают, без перекомпиляции других скриптов, флешей и тд, просто свой мод в несколько строк 100% на питоне способ есть и рабочий Нужно отблагодарить себя чекуней, ураааа mod.jpg А теперь поделись секретом, пожалуйста :) @ Quote Link to comment Short link Share on other sites More sharing options...
Ekspoint Posted March 20, 2015 Author Share Posted March 20, 2015 Ночь за компом, скрипты скрипты скрипты и под утро .... способ есть, на питоне, всего 2 строчки и урл в сообщениях работают, без перекомпиляции других скриптов, флешей и тд, просто свой мод в несколько строк 100% на питоне способ есть и рабочий Нужно отблагодарить себя чекуней, ураааа mod.jpg Примерчик :) Megagrob, в лс написал @ Quote Link to comment Short link Share on other sites More sharing options...
Megagrob Posted March 20, 2015 Share Posted March 20, 2015 (edited) del Edited April 27, 2015 by Megagrob 9 @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted April 18, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
Megagrob Posted April 27, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted April 27, 2015 Share Posted April 27, 2015 @Megagrob, большое спасибо :) @ Quote Link to comment Short link Share on other sites More sharing options...
Megagrob Posted April 27, 2015 Share Posted April 27, 2015 @Megagrob, большое спасибо :) та не за что Потестите на ошибки в работе клиента, может где глюки появились @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted April 27, 2015 Share Posted April 27, 2015 Потестите на ошибки в работе клиента, может где глюки появились Всё ровно. Сколько кликал (как на чистом клиенте, так и с установленным на него XVM`ом) - всё нормально. В логе обычный ВГшный срач, или как там это называется) @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted April 27, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.