13.03.2017
Новая штука для DC! В этот раз это плагин, который позволяет другим плагинам быть написанными на языке Python 2.5 2.7 (с v1.0.2). Ну, если быть более точным, называется он Jython и поддерживает не только модули, входящие в стандартную поставку Python-интерпретатора, но и библиотеки Java. Пример простейшего плагина для изучения присутствует в архиве для версий до 1.2.0 или его можно скачать отдельно для поздних версий (test_python).
По сути тут поддерживаются вызовы тех же функций, что и в Groovy-плагине (sendMessage()
, addMessageListener()
, getPluginDir()
и т. д.), но мне пока не удалось элегантно "заинжектить" их в интерпретатор именно как функции*. Поэтому взаимодействие с системой сообщений приложения осуществляется через так называемую шину (bus) — специальный объект, проксирующий вызовы методов в Java-код.
* Сделать плагин наследником Java-класса, как сделано для Groovy-плагинов у меня не получилось. В многообразии Джавовских "коллбэков" я тоже плохо ориентируюсь. Ближе всего к желаемому результату получилось заинжектить Грувовский Closure. Но из Python-кода его приходится вызывать через callOn()
, что ещё хуже, чем решение с шиной. Может потом я всё-таки что-нибудь придумаю. Или кто-нибудь подскажет. В любом случае, обратная совместимость с шиной будет сохранена.
Как обычно, два варианта установки, которым надо указать папку с DC.
Для особых "извращенцев", любящих голый код и ручную сборку, ссылка на ветку.
Скачать тестовый плагин-пример (для версий до 1.2.0 он включён в основной архив):
Также не забываем подписываться на мой канал в Telegram! Там новости, связанные с этим проектом, выходят первыми. А ещё я там публикую некоторые эксклюзивные штуки, связанные с мессенджером.
Обновление от 24 марта 2017 (v1.0.1)
- Восстановлена совместимость с последними версиями приложения, переделанного со Swing на JavaFX;
- добавлены новые методы для логирования, доступные Groovy-плагинам;
- добавлен нестандартный метод
say()
, облегчающий вывод сообщений иавтоматически приводящий строку к нужной кодировке(почему-то там опять что-то отвалилось, так что поправлю завтра); качестве параметра принимает любой объект, приводимый к строке (то есть вообще любой, лол); - плагин-пример теперь использует стандартный таймер, а не из Swing.
Старые ссылки: ZIPак (v1.0.0), SFX (v1.0.0).
Обновление от 25 марта 2017 (v1.0.2)
- Исправлена ошибка с кодировками, оставшаяся в предыдущей сборке;
- зависимость изменена с Jython 2.5.2 на более новый 2.7.1b3, что позволяет пользоваться новыми фишками языка и улучшает совместимость со сторонними модулями;
- добавлен Python-модуль busproxy, который содержит функции, проксирующие вызовы к шине, и алиасы к ним с именами более близкими стилю языка; просто импортируйте из него все или только нужные функции и больше не пишите постоянно «
bus.
»!
Кроме того, я придумал, как мне кажется, оптимальный вариант для дистрибуции зависимостей. К JYTHON_PATH теперь отдельно добавляется папка __dependencies__
внутри папки Вашего плагина. Туда я и предлагаю устанавливать все зависимости с помощью следующей команды, чтобы не мешались:
pip install --target=__dependencies__ --ignore-installed <названия пакетов...>
Таким образом, Вы сможете распространять архив с плагином со всеми зависимостями внутри, и пользователю не надо будет ничего докачивать!
Старые ссылки: ZIPак (v1.0.1), SFX (v1.0.1).
Обновление от 17 апреля 2017 (v1.1.0)
- Плагины теперь компилируются только при загрузке. Это значит, что плагины, занесённые в «чёрный список» больше не будут тратить время на собственную компиляцию. Но при этом при каждой загрузке плагина через load/unload или blacklist/unblacklist он будет компилироваться заново. Также это позволяет ещё немного обособить плагины друг от друга.
- Методы шины
getPluginDirPath()
,getDataDirPath()
и их псевдонимы в модуле busproxy теперь возвращают строки, а не объект Path из Java-кода. Это позволяет без лишних преобразований пользоваться стандартным Питоновским модулем os.path. - Метоод
say()
вновь поддерживает не только строки, а любые объекты, приводимые к ним. Также теперь ему можно передавать те же дополнительные параметры приоритета, спрайта и таймаута, какие доступны через обычныйsendMessage()
. - Добавлен новый метод
getId()
, который позволяет получить идентификатор плагина (на данный момент, это строка с его именем). - Документация обновлена до актуального состояния.
- В тестовый плагин-пример (test_python) добавлена демонстрация новых возможностей, а текстовое поле в настройках теперь не просто выводит сообщение, а позволяет выполнять и тестировать однострочные команды на языке Python.
- Добавлен новый модуль pluginutils, предоставляющий классы Settings и Localization, предоставляющие для плагинописателей встроенные средства для сохранения настроек плагина и создания мультиязычных плагинов. Подробнее можно почитать в документации или посмотреть в обновлённом плагине-примере.
Старые ссылки: ZIPак (v1.0.2), SFX (v1.0.2).
Обновление от 21 апреля 2017 (v1.1.1)
Исправлено несколько ошибок, в том числе с кодировками и кроссплатформенностью.
Старые ссылки: ZIPак (v1.1.0), SFX (v1.1.0).
Обновление от 28 мая 2017 (v1.2.0)
Помимо обновления тестового плагина под изменившийся API, а также добавления новой функции get_root_dir_path и мелких изменений вроде логгирования загрузки плагинов (раньше были типы ошибок, которые заканчивались исключением без указания источника; теперь выяснить виновника проще), была почти полностью переработана система работы с шиной. И это очень важный момент, поскольку содержит изменения, не совместимые с предыдущей версией!
В прошлых версиях был серьёзный баг: все загружающиеся плагины, пользующиеся моими модулями, переписывали для этих самых модулей общую ссылку на pluginProxy. Поэтому все плагины выполнялись от ID последнего загруженного плагина. Я придумал, как это исправить, но пришлось полностью изменить логику работы этих самых модулей.
В итоге теперь нельзя импортировать нужные функции из busproxy. Теперь нужно импортировать его и вызвать функцию inject, передав ей ссылку на шину и текущую область видимости. А меняя ссылку на область видимости, можно «инжектить» функции в другие модули. По умолчанию внедряются все функции, но можно ограничить только до перечисленных.
Также обратите внимание, что get_instance у модулей локализации и настроек теперь всегда требует ссылку на шину! Поэтому при необходимости либо передавайте её в другие модули, либо сделайте собственный статический класс-хранитель, который будете инициализировать в начале плагина, а дальше использовать из других модулей (подобный подход использован в плагине vk_message_reader, который будет опубликован на днях).
В общем, советую изучить плагин-пример, который, начиная с этого релиза, не включён в основной архив, а идёт отдельно, и посмотреть, как всё реализовано там. Ну а ещё есть же и документация.
Для работы требуется версия DC не ниже сборки от 30 апреля.
Старые ссылки: ZIPак (v1.1.1), SFX (v1.1.1).
Обновление от 9 сентября 2017 (v1.2.1)
- Восстановлена работоспособность с новыми версиями DeskChan (начиная с v0.2.0-r256).
- Библиотека jython-standalone:2.7.1b3 заменена на вышедшую релизную версию 2.7.1.
- Добавлены манифесты.
Старые ссылки: