Jump to content
Korean Random
Ekspoint

Как сделать ссылку в центре уведомлений кликабельно?

Recommended Posts

Нужно сделать поддержку других ссылок в центре уведомлений кликабельно ( можно и с привязкой xvm)

Share this post


Link to post

Short link
Share on other sites

Нужно сделать поддержку других ссылок в центре уведомлений кликабельно ( можно и с привязкой 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 by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

Перекомпилить 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);
            }

И тогда можно будет в системном канале сделать кликабельную ссылку.

Это исходник, а в готовом как?

Share this post


Link to post

Short link
Share on other sites

Через питон же можно всё сделать...

и как же?

пример можно?

Share this post


Link to post

Short link
Share on other sites

Это исходник, а в готовом как?

Никак.

 

Через питон же можно всё сделать...

Написал, что знаю)

Share this post


Link to post

Short link
Share on other sites

Никак.

 

Написал, что знаю)

так как через питон?

Share this post


Link to post

Short link
Share on other sites

Ночь за компом, скрипты скрипты скрипты и под утро .... способ есть, на питоне, всего 2 строчки и урл в сообщениях работают, без перекомпиляции других скриптов, флешей и тд, просто свой мод в несколько строк :gawi:

100% на питоне способ есть и рабочий

Нужно отблагодарить себя чекуней, ураааа :flag:

post-30696-0-15586700-1426854923_thumb.jpg

  • Upvote 2
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Ночь за компом, скрипты скрипты скрипты и под утро .... способ есть, на питоне, всего 2 строчки и урл в сообщениях работают, без перекомпиляции других скриптов, флешей и тд, просто свой мод в несколько строк :gawi:

100% на питоне способ есть и рабочий

Нужно отблагодарить себя чекуней, ураааа :flag:

attachicon.gifmod.jpg

А теперь поделись секретом, пожалуйста :)

Share this post


Link to post

Short link
Share on other sites

Ночь за компом, скрипты скрипты скрипты и под утро .... способ есть, на питоне, всего 2 строчки и урл в сообщениях работают, без перекомпиляции других скриптов, флешей и тд, просто свой мод в несколько строк :gawi:

100% на питоне способ есть и рабочий

Нужно отблагодарить себя чекуней, ураааа :flag:

attachicon.gifmod.jpg

Примерчик :)

Megagrob, в лс написал

Share this post


Link to post

Short link
Share on other sites

Делюсь способом взамен на методы вывода передвигаемых :) окон (диалоги уже умею), кнопок, исходник апдейтера типа Notification Box, стрим информер, подтверждения типа принятия во взвод и тд, тоесть различные формы. Например исходник мода вывода произвольной информации в окно, и кнопка к нему. Вывод сообщений в ангере и в бою уже знаю, ну разве что вывод gui элементов (текст, графика) в бою (кое что знаю, но может что новое) Интересуют исходники модов аналогичные модам ПРОТанки, или они сами.

Тут немного по-другому все происходит - ты помогаешь людям, люди помогают тебе.

 

Хотя если честно, я сомневаюсь в том, что можно сделать кликабельной ссылку в 2 строчки. Если клиент чистый (не установлен XVM, c ним проще -> <a href="event:http://www.google.ru/">Google</a>), то все не так просто (я во флеше и ActionScript не шарю, так что прошу не закидывать меня помидорами)

Эвент клика по ссылке дропается обработчиком

post-21078-0-77442900-1429314938_thumb.jpg

А вот этот обработчик устанавливается

this.list.addEventListener(ServiceMessageEvent.MESSAGE_LINK_CLICKED, this.messageLinkClickHandler, false, 0, true);
(со стороны питона - scripts/client/notification/NotificationListView.py)

Вот это, насколько я понимаю, вызов события?

post-21078-0-89380900-1429316403_thumb.jpg

Примерно то же самое делается в XVM

Ладно посмотрим, куда это событие выходит:

onSecuritySettingsLinkClickS();
Интерфейс:

post-21078-0-46616200-1429318309_thumb.jpg

Класс со стороны питона найти не удалось(

Мета-класс

post-21078-0-25474900-1429318655_thumb.jpg

Питон

scripts/client/gui/Scaleform/daapi/view/meta/NotificationsListMeta.py

А вот и самое интересное: функция onSecuritySettingsLinkClick объявлена как публичная переменная - она написана уже не на флеше, а подтягивается от питона! Из того самого мета-класса. Правда она перегружается в основном классе (scripts/client/notification/NotificationListView.py). Алгоритм всего этого до конца я еще не вкурил, но очевидно одно - просто так без патча флеша ссылку кликабельной не сделать. Ну а если патчить, то там можно либо напрямую из флеша браузер запустить (не уверен, что можно), либо аналогичным образом пробросить эвент через DAAPI и обработать на питоне.

Я конечно не отрицаю каких-то альтернативных путей, но то что в классах NotificationList*** в питоне без патча флеша ловить нечего, это очевидно. А поскольку эти классы определены в Application.swf, то патчить скрипты непосредственно флешки, отвечающей за системные сообщения бесполезно, патчить нужно именно Application.swf... А replace-patch не самая крутая идея, поскольку возможны конфликты между модами на уровне замены файла / очередном обновлении от картохи.

  • Upvote 4

Share this post


Link to post

Short link
Share on other sites

Прошу сильно не пинать и не ржать, если что, я ж не гуру ;)
Итак...
Если установлен 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 by Megagrob
  • Upvote 4

Share this post


Link to post

Short link
Share on other sites

@Megagrob, большое спасибо :)

та не за что

 

Потестите на ошибки в работе клиента, может где глюки появились

Share this post


Link to post

Short link
Share on other sites

 

 

Потестите на ошибки в работе клиента, может где глюки появились
Всё ровно. Сколько кликал (как на чистом клиенте, так и с установленным на него XVM`ом) - всё нормально. В логе обычный ВГшный срач, или как там это называется)

Share this post


Link to post

Short link
Share on other sites

Кто может доработать качественно, тому респект и уважуха.

Вместо переопределения класса можно сделать хук. Для тех, кто в танке - компилится отдельным файлом, кидается в папку со скриптами (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
  • Upvote 4

Share this post


Link to post

Short link
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...