Jump to content
Korean Random
wotunion

[0.9.14] Мод Clan News (v.2, 23.03.2016)

Recommended Posts

post-27262-0-45826000-1458773975.png

Давно искал такое решение, наконец, добрался)
 
Зеленым цветом шрифта показаны изменения в v.2
 
Использованы фрагменты кода из тем, за что большое спасибо авторам сообщений:
www.koreanrandom.com/forum/topic/25584-как-создать-сообщение-с-кнопками-в-центре-уведо/
www.koreanrandom.com/forum/topic/29604-прошу-помощи-по-accountonbecomeplayer-и-playeravataronenterworld/
www.koreanrandom.com/forum/topic/22719-как-сделать-ссылку-в-центре-уведомлений-кликаб/
 
Особенности:

  • Поскольку мод клановый, получает информацию с указанного вами веб-сервера, - предоставляется в виде исходников, где нужно прописать ссылки на сервер, ID клана и.т.п., а потом скомпилировать и защитить (можно использовать, например, PjOrion);
  • Мод работает как на чистом клиенте, так и с XVM;
  • Мод проверяет наличие своих обновлений и самообновляется (автообновление можно отключить в конфиге);
  • В уведомлениях можно указывать ссылки;
  • Для уведомления устанавливается срок действия, по истечению которого оно отображаться не будет;
  • Мод получает указанные на сервере оповещения только если клан игрока, использующего мод соответствует разрешенному в моде, т.е., игрок другого клана, установивший мод, новости Вашего клана получать не будет;
  • Мод управляется с помощью конифигурации в json-формате, находящейся на сервере;
  • Оповещения читаются и форматируются (цвет, ссылки и т.п.) из текстовых файлов на веб-сервере;
  • Для оповещений используются 2 типа уведомлений: 1. Warning - (значок '!'); 2. GameGreeting - (значок конверта);
    • Уведомления обеих типов показываются всегда один раз при входе в ангар, если соответствующий текстовый файл на сервере не пустой, не истекло время действия уведомления и уведомление включено в конфиге для отображения;
    • Есть исключение: уведомления обеих типов показываются после выхода из боя если после входа в ангар в соответсвующие текстовые файлы были внесены новые оповещения, отличающиеся от полученных первоначально, т.е. время показа нового уведомления игроку клана не превышает времени боя, а также если не истекло время действия уведомления и уведомление включено в конфиге для отображения;

Итак, 

"Настройки в исходном коде и компиляция"


Имеем:
################################################################################################
#Настройки перед компиляцией
################################################################################################
ConfigURL = 'http://exampleserver123qwerty.com/mod/modconfig.json'
apiURL = 'http://api.worldoftanks.ru/wot/account/info/?application_id=demo&account_id={0}'
mod_Version = 2
AllowedClanID='000000000000000000000'
################################################################################################
################################################################################################

 Следует прописать значения переменных (используйте кодировку UTF-8 with BOM):
 
ConfigURL - URL к файлу конфигурации в json-формате;
apiURL - URL части запроса, результаты которого используются для получения ID клана игрока;
mod_Version - версия мода (числовое значение);

AllowedClanID - разрешенный ID клана, если не будет соответствовать клану игрока, использующего мод - клановые новости показываться не будут, с выводом соответствующей ошибки.
 
Компилируем код.
 
Копируем мод в папку ..\res_mods\(версия клиента\scripts\client\gui\mods\mod_(название).pyc.
Файл ОБЯЗАТЕЛЬНО должен начинаться с 'mod_'.


"Настройки на веб-сервере"


Опишу на примере Apache.
 
Например,
  • Создаем папку mod;
  • В папке mod создаем папки InfoWarning, InfoGreeting, и файлы modconfig.json, ModUpdatedInfo.txt;
  • В папке InfoWarning создаем файл InfoWarning.txt и файл days_active.txt;
  • В папке InfoGreeting создаем файл InfoGreeting.txt и файл days_active.txt;
  • Во всех этих папках создаем файл .htaccess;

Содержимое файлов:
 
Используйте кодировку UTF-8.
 
InfoWarning/InfoWarning.txt:

<font color="#66ff00">[Клан-тег] Новости</font>
Новости Warning  (!)
<a href="event:http://www.koreanrandom.com/">Детальнее</a>

InfoGreeting/InfoGreeting.txt

<font color="#66ff00">[Клан-тег] Новости</font>
1. Новости GameGreeting  (letter)
<a href="event:http://koreanrandom.com">Детальнее</a>

ModUpdatedInfo.txt

<font color="#66ff00">Мод Clan News обновлен</font>
Изменения вступят в силу после следующего запуска игрового клиента

days_active.txt

21.03.2016 00:00:00

Время, до которого уведомление будет отображаться
Только такой формат.
 
.htaccess

AddDefaultCharset utf-8
Options -Indexes

modconfig.json

{
  "Config": {
    "version": 1,
    "date": "23.03.2016"
  },
  "mod": {
    "name": "[Mod Clan News]",
    "version": 2,
    "date": "23.03.2016"
  },
  "common": {
    "CommonModFolder": "\\scripts\\client\\gui\\mods\\",
    "for_WOT_Version": "0.9.14"
  },
  "update": {
    "sha-256": "69d914113e517676769659aa8773c18e194f5794673e49bcbbe88dae9c344c17",
    "AllowOnlyAfterRestartClient": false,
    "AutoUpdateAllowed": true,
    "mod_UpdateURL": "http://exampleserver123qwerty.com/mod/mod_Clan_Info_v3.pyc"
  },
  "msg": {
    "Notice": {
      "Allowed": true,
      "InfoNoticeURL": "http://exampleserver123qwerty.com/mod/InfoWarning/InfoWarning.txt",
      "DaysActiveURL": "http://exampleserver123qwerty.com/mod/InfoWarning/days_active.txt"
    },
    "NoticeGeneral": {
      "Allowed": true,
      "InfoNoticeGeneralURL": "http://exampleserver123qwerty.com/mod/InfoGreeting/InfoGreeting.txt",
      "DaysActiveGeneralURL": "http://exampleserver123qwerty.com/mod/InfoGreeting/days_active.txt"
    },
    "ModUpdatedInfoURL": "http://exampleserver123qwerty.com/mod/ModUpdatedInfo.txt"
  }
}

InfoNoticeURL - URL к файлу, содержащему уведомления второго типа;
InfoNoticeGeneralURL - URL к файлу, содержащему уведомления первого типа;
mod_VersionCheckURL - URL к папке на сервере без названия файла - для обслуживания проверки обновлений мода;
mod_UpdateURL - URL к файлу обновления (.pyc файл);
ModUpdatedInfoURL - URL к файлу, содержащему уведомление о успешном обновлении мода;
AutoUpdateAllowed - переключатель запрета/разрешения автоообновлений мода;
Allowed - переключатель запрета/разрешения отображения уведомления; 

AllowOnlyAfterRestartClient - при установке в 'false', мод, после успешного автообновления, не будет отображать уведомления до перезапуска клиента;
['mod']['version'] - версия актуального мода, мод, установленный у игрока сверяет свою версию с этой при проверке обновлений; 

for_WOT_Version - версия WOT и название актуальной папки в res_mods, обязательный параметр для работы автообновления;
sha-256 - SHA256-хэш файла, указанного в mod_UpdateURL, используется для проверки целостности загруженного обновления.

 


Скриншоты


post-27262-0-45826000-1458773975.png

post-27262-0-66385200-1458514604.png

Для защиты кода используйте средства PjOrion, а также пользуйтесь SSL или TLS.

Вроде все.
 
upd. https-ссылки таки работают.
 
Скачать


Edited by wotunion
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

так просто https-ссылки в питоне не заработают...

Мда, согласен, надо tlslite прикрутить

Хотя, нет, уже читал доки по tlslite, решил все-таки проверить. Оригинальный скрипт из шапки, замена 'http' на 'https', import urllib2 вместо urllib(не валидирует сертификат) и все работает по TLS как на чистом клиенте, так и с XVM, ни одного голого HTTP запроса:

 

post-27262-0-98709900-1458597111_thumb.png

 

Возможно поддержку уже включили в игровом питоне?

Share this post


Link to post

Short link
Share on other sites

Добавил возможность самообновления мода, а также установки времени активности уведомлений от момента их публикации.

На днях выложу.

Edited by wotunion

Share this post


Link to post

Short link
Share on other sites

Обновлено до v.2: Добавлена возможность самообновления мода, а также установки времени активности уведомлений от момента их публикации. Большинство настроек перенесено в json.

Share this post


Link to post

Short link
Share on other sites

hi, i try this mod....igame i no see message. :/ , can u create, demo mod - files for upload on server, file to game is: ...res_mods / 0.9.14 / scripts / gui / mods /

Share this post


Link to post

Short link
Share on other sites

проверку на наличие игрока в клане проще можно сделать и без подключения к апи


from messenger.proto.bw.ClanListener import ClanListener

class ClanName(ClanListener):
    def name(self):
        return self.playerCtx.getClanAbbrev()
        
clan = ClanName()

if clan.name():
    print 'I am a member of a clan'
else:
     print 'I am not in a clan'

и правильнее так

def LoadConfig():  
    return load(urlopen(ConfigURL)) 

Config = LoadConfig()

потом в

new_onAccountShowGUI

удаляешь

LoadConfig()

еще

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

на

def new_NotificationsActionsHandlers_handleAction(self, model, typeID, entityID, actionName):
    import sys
    if actionName.lower().find('http://') or actionName.lower().find('https://') 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
Edited by Ekspoint

Share this post


Link to post

Short link
Share on other sites

проверку на наличие игрока в клане проще можно сделать и без подключения к апи

Зачем так? То же самое можно сделать намного проще, в одну строку:

import messenger.storage
clan = messenger.storage.storage_getter('playerCtx')().getClanAbbrev()
Ну это если делать в лоб и на уровне мессенджера. Хотя наверняка есть более адекватные способы узнать клантег.

на

Условие не будет правильно выполняться. Нужно либо добавить к первому пункту is None, либо скобки поставить.

>>> (None or None) is None
True
И find юзать тоже необязательно. Достаточно просто написать:

'http://' not in actionName.lower() and 'https://' not in actionName.lower()
Хотя вариант с regex мне нравится больше.

Share this post


Link to post

Short link
Share on other sites
hi, i try this mod....igame i no see message. :/ , can u create, demo mod - files for upload on server, file to game is: ...res_mods / 0.9.14 / scripts / gui / mods /

 Please attach python.log.

Sorry, i can`t build demo mod, because my web-server is not for testing purposes

 

 

res_mods / 0.9.14 / scripts / gui / mods /

That's wrong, correct: 'res_mods\0.9.14\scripts\client\gui\mods\'

 

 

import messenger.storage clan = messenger.storage.storage_getter('playerCtx')().getClanAbbrev()

Спасибо, попробую 

Edited by wotunion

Share this post


Link to post

Short link
Share on other sites

Возможно как-то разделить новости по ролям в клане?

Для бойцов одна новость, для старшего состава расширенные новости,  командованию все новости.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
Возможно как-то разделить новости по ролям в клане? Для бойцов одна новость, для старшего состава расширенные новости,  командованию все новости.

 

 

Можно. Кстати, неплохая идея, добавлю в ToDo.

Edited by wotunion
  • Upvote 1

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...