Jump to content
Korean Random

DIVlNATOR

User
  • Posts

    20
  • Joined

  • Last visited

Posts posted by DIVlNATOR

  1. 4 минуты назад, yepev сказал:

    @DIVlNATOR No, everything is fine with his XVM and this is not related to the http request or dev version of the mod. This is a bug.


    Из за авторизации через WGApi? Кста раз коснулся токена. Тут разве при авторизации не нужно указать токен? или "-" это как раз запрос на получение нового токена? stat.modxvm.com/ /4.0/getToken/-/7047809506

    image.png.421032b5677d7fc40d2863df6926809e.png

     

    P.S. Сейчас попытался дернуть что нить через Wgapi на азии - нет ответа.. Хм.. Может с этим связано?

  2. 31 минуту назад, XU20211108 сказал:

     

    Thank you for your reply.

    The configuration file I used has not been changed.

    So it should not be a configuration file problem.

    Before this article, several versions of XVM could not display time information in the hangar.

    (sorry can't speak English,Machine translation with.)

     

    I'm sorry I didn't figure it out right away. It's not about the config, but about the http request. At the entrance to the hangar, as far as I understand, the mod tries to log in .. It's strange that the token is not transmitted (although it may be normal): /4.0/getToken/-/7047809506. Then it receives an http response, but cannot recognize the cp936 encoding. Maybe you'd better not use the DEV version of the mod? And download the standard one: https://dl1.modxvm.com/release/xvm_8.9.4.zip ? (sorry machine translation)

    P.S. Many thanks to the google translator for the fact that Russian can communicate with Asian. ))

  3. Доброго времени суток.

    Не сходятся значения с моим подсчетом и данными по статистике xvm.

     

    Я высчитываю средний уровень техники за бой, используя WGAPI.

    1. Сохраняю все танки из метода раздела "Танкопедия" метод "Техника".
    2. Беру данные из раздела "Техника игрока" метода "Статистика по технике игрока" поля "tank_id" и "battles". и открываю Stream, в котором делаю mapToInt (грубо превращая объект в число, но не суть). Далее к каждому объекту делаю п.3, п4.
    3. Нахожу по "tank_id" из п.1 значение "tier". В случае если я не нахожу танк (тестерский например), то исключаю его, попутно подсчитывая сыгранные на них бои.
    4. Перемножаю "battles" на "tier"
    5. Результат полученных значений стрима суммирую.
    6. Беру данные из раздела "Аккаунты" метод "Персональные данные игрока" из них, только рандомные бои.
    7. Вычитаю из п.6 бои на тестерской технике.


    Результат всего этого:

    • п7 - соответственно, за вычетом тестерских боев - количество боев со статистикой XVM не сходится.
    • средний уровень техники за бой сходится.
    • Если тестерские бои из рандомных не вычитать - то также со статистикой XVM сходится.

     

    Вопрос @Mixaill : Как правильно все таки считать?

     

  4. Добрый день господа.
    В связи с тем, что цветовые границы рейтингов меняются каждую неделю, существует ли версия этих данных в формате json которую можно было бы получить http запросом?

    В исходниках мода (c python не особо) выявил, что мод берет эти данные из конфига. Но заметил, что существует api "static.modxvm.com". Есть ли способ получить эти данные от api? Или есть документация к api?

    UPD. Спасибо нашел

     

    • Upvote 1
  5. @Ekspoint Спасибо.. Да недавно натолкнулся в исходниках night_dragon_on...

    Единственное я не понял как работать с кодировкой... В Orione данный фокус норм отрабатывал:

    string = 'Привет всем!'.decode('cp1251')
    string.encode("utf-8")

    После компиляции в названии окошка в боевом клиенте надпись типа "Ppp". В шапке файла стоит указание на кодировку файла...

    # -*- coding: utf-8 -*-

    Причем в клан чат пишется все по русски.

    Не знаю... Может смотрю в сторону того, что нужно найти как подгружаются файлы *.mo. Добавить свой файлик и из него уже забирать фразы.. Но думаю, что есть способ легче)))

  6. @StranikS_Scan 
    Спасибо. Я понял уже... Прочитал про getAttr и setAttr. Попутно просто Python изучаю. Я вот так еще обернул в декоратор:

    # coding=utf-8
    
    from gui.mods.autumn_core import AutumnEnum
    
    # Декоратор для замены методов обьявленного класса
    #
    #   @Override(Class, 'method')
    #   def test(self, *args)
    #
    class Override:
        __methodType = None
        __methodName = None
        __clazz = None
    
        MethodType = AutumnEnum(['FUNCTION', 'METHOD', 'STATICMETHOD'])
    
        @classmethod
        def __init__(cls, clazz, method_name, method_type=MethodType.FUNCTION):
            """
            :type clazz: type
            :type method_name: str
            :type method_type: MethodType
            :return None
            """
            cls.__clazz = clazz
            cls.__methodName = method_name
            cls.__methodType = method_type
    
        @classmethod
        def __call__(cls, *args, **kwargs):
            func = args[0]
            if type(func == 'function'):
                
                if cls.__methodType == Override.MethodType.METHOD:
                    cls.__overrideMethod(func)
                elif cls.__methodType == Override.MethodType.STATICMETHOD:
                    cls.__overrideStaticMethod(func)
                else:
                    cls.__overrideMethod(func)
    
        @classmethod
        def __override(cls, new_method):
            if hasattr(cls.__clazz, cls.__methodName):
                if isinstance(getattr(cls.__clazz, cls.__methodName), property):
                    setattr(cls.__clazz, cls.__methodName, property(new_method))
                else:
                    setattr(cls.__clazz, cls.__methodName, new_method)
    
        @classmethod
        def __overrideStaticMethod(cls, new_method):
            cls.__override(staticmethod(new_method))
    
        @classmethod
        def __overrideMethod(cls, new_method):
            cls.__override(classmethod(new_method))
    
    
    class Test(object):
    
        def test(self):
            return 1234
    
    
    print Test.test()
    
    
    @Override(clazz=Test, method_name='test')
    def test2():
        return 555
    
    print Test.test()

     

  7. @Ekspoint Спасибо...

    Еще вот так пробовал, но там нету сеттера:
     

    from messenger.storage import storage_getter, ChannelsStorage
    
    class ClanChannelCriteria(object):
        def filter(self, channel):
            return channel.getName() == '[SPCTE]'
    
    storage = storage_getter('channels')()
    
    if isinstance(storage, ChannelsStorage):
        channel = storage.getChannelByCriteria(ClanChannelCriteria())
        
        print channel.getName()

     

  8. Добрый день товарищи...
    Python до этого не изучал, многое что не особо понятно после Java.

    Немного не пойму строчку из мода "mod_versus":

    old_getFullName = BWChannelEntity.getFullName

    1) почему BWChannelEntyty - это статичный класс?
    2) почему "getFullName" укзана как переменная, а не метод?

    3) а. Если выполнить из PJOrion, то в первом случае исключение:

    *** NameError: name 'BWChannelEntity' is not defined
    ***
    *** <unbound method BWChannelEntity.getFullName>

     б. А если выполнить как BWChannelEntity.getFullName() то:
     

    *** TypeError: unbound method getFullName() must be called with BWChannelEntity instance as first argument (got nothing instead)


    4) Я наверно не совсем понимаю как получить обьявленный ранее обьект и изменить его...

     

    В конечном итоге, я хочу получить: Найти окно клан-чата, и переименовать его
     

  9. Доброго времени суток сообщество!

    Недавно мне необходимо было поработать с WGPAPI, но для удобства работы с получением данных, я не нашел ни одной подходящей библиотеки написанной на Java (Либо плохо искал). Решил исправить это. Представляю вам свой небольшой проект:

     

    Java SDK для работы с Wargaming.net Public API

    Приступая к работе

    Перед началом работы с Wargaming.net Public API, ознакомьтесь с условиями использования и документацией. Далее вам необходимо зарегистрировать приложение.

    Для регистрации необходимо:

    1. Войти в кабинет разработчика
    2. Перейти в раздел "Мои приложения"
    3. Нажать "Добавить приложение" (На экране появится форма для регистрации приложения).
    4. Выбрать тип приложения. См. Типы приложений.
    5. Ввести название приложения (Когда произведён вход в приложение, его название будет отображено на странице «Сеансы» в «Личном кабинете» пользователя).
    6. Нажать "Добавить приложение" (На экране появится список добавленных приложений).
    7. После успешной регистрации приложения вы получите идентификатор приложения (Далее по тесту "application_id"), который является идентификатором вашего приложения для обращения к API.

    Для получения контента WG Public API регистрация приложения является обязательной. См. Использование application_id.

     

    Предварительные условия

     

    Зависимости проекта

    Расширение для WgApiClient использует:

     

    Документация проекта

    Документация проекта доступна тут.

     

    Установка

    Можно взять от сюда: Maven

    Добавить в файл "pom.xml" вашего проекта следующую зависимость:

    <dependency>
      <groupId>io.github.divinator.wgapi</groupId>.                                     
      <artifactId>wgapi-client-wot</artifactId>
      <version>LATEST_VERSION</version>
    </dependency>

     

    Использование

    Доступно несколько возможностей сконструировать обьект:

    • Указать только "application_id"
    WgApiClient client = new WgApiClient("application_id");
    • Указать "регион" и "application_id"
    WgApiClient client = new WgApiClient(Region.RU, "application_id");
    • Указать "транспортный протокол", "регион" и "application_id"
    WgApiClient client = new WgApiClient(new NetHttpTransport(), Region.RU, "application_id");

    Указание собственного транспортного протокола возможно потребуется в случае, если работа клиента будет осуществляться через Proxy-сервер.

    • Далее необходимо инициализировать нужный "метод-блок", и у него вызвать нужный метод, с указанием параметров:
    AccountsMethod methodBlock = client.getMethodBlock(AccountsMethod.class);
    
    Map<String, AccountInformation> accountInfo = 
             methodBlock.getAccountInfo("DIVlNATOR", null, null, null);

    Как вы успели уже заметить, в параметры метода можно передать значение "null". Переменные метода могут быть, как обязательные к заполнению, так и "null" (необязательные). Чтобы избавиться от "null", можно расширить нужный "метод-блок" и переопределить нужный метод.

    • Возвращаемое значение у методов "метод-блока" может быть нескольких типов:
    <Entity>
    List <Entity>
    Map <String, Entity>
    Map <String, List <Entity>>

    Entity - это сущности Wargaming.net Public API (см. документацию) со своими методами.

    Далее описан процесс получения нужных данных из "Entity", на примере "AccountInformation"

      AccountInformation accountInformation = accountInfo.get("3999999");
      accountInformation.getNickname();
      accountInformation.getAccountId();

    Лицензия

    Этот проект лицензируется в соответствии с лицензией Apache — подробности см. в файле LICENSE

    • Upvote 2
  10. @Kotyarko_O@EkspointБольше нет способов отобразить web-страницу, не используя интерфейс встроенного браузера движка игры (Как я понял по коду. не работал с питоном, может не правильно интерпретирую синтаксис)? Например в JavaFX есть WebView и WebEngine (webkit). Что то типа открываем окно добавляем WebView c указанным URI.

×
×
  • Create New...