Предложения по плагинной системе

Больше
16 года 8 мес. назад #1 от PRO
Здесь попытаюсь собрать все свои идеи насчет плагинов и их апи. Крыска развивается, в ней появляются новые возможности, а плагины остаются на том же уровне и не могут взаимодействовать с ними.

Сначала о багах - в крыске не работают команды PG_ANDRQ_VER и PG_ANDRQ_VER_STR - тестил на 1056 и 1070, возвращают одно и то же, причем версии там никак нету) PG_CONNECTIONSTATE - возвращает 2 при подключенной крысе, хотя должно 1.

Теперь какие бы апи хотелось видеть в плагинной системе:

if topic = PM_GET // asking data
BYTE what
if what = PG_XSTATUS // получить текущий допстатус
empty
possible replies:
PM_DATA INT (xstatus) ISTRING(xstatus_name) ISTRING(xstatus_text)
if topic = PM_EVENT // event notification
BYTE event
if event = PE_AUTHDENIED_GOT // получен отказ в авторизации
INT dest uin
ISTRING text
if event = PE_REMOVED_HIMSELF // контакт удалил себя
INT dest uin
if topic = PM_CMD // execute command
BYTE cmd
if cmd = PC_SET_XSTATUS // установить допстатус
INT xstatus
ISTRING xstatus_name
ISTRING xstatus_text
if cmd = PC_REMOVE_MYSELF // удалить себя из списка контактов заданного uin
INT dest uin
if cmd = PC_SEND_AUTOMSG_REPLY // послать ответ на запрос автосообщения без запроса
INT uin
ISTRING automsg
if cmd = PC_SET_XSTATUS // то же самое с допстатусом
INT uin
INT xstatus
ISTRING xstatus_name
ISTRING xstatus_text
if cmd = PC_ADDMENUITEM // добавить пункт меню
INT menuproc // адрес процедуры-обрабочика
INT icon // значок пункта меню
ISTRING text // название пункта меню
CHAR where // куда добавить: меню контакта, главное меню, меню чата
possible replies:
PM_DATA INT id // идентификатор созданного пункта меню, используеца для удаления и изменения
// можно сделать пункт меню который виден при зажатом shift, подменю и проч, я лишь выразил идею. ибо странно, что кнопки в чате можно делать, а пункты в меню нет. ну и команды для удаления/изменения меню
if cmd = PC_SET_HANDLINGTYPE // установить режим обработки событий плагином
CHAR type // режим обработки: 0 - только события (как сейчас в плагинах PE_*, по умолчанию), 1 - только пакеты (оповещение о пакетых делается отдельными событиями PE_PACKET_GOT и PE_PACKET_SENT), 2 - оповещение обо всех событиях и всех пакетах, 3 - оповещения о всех событиях и пакетах, которые не продублированы событиями (например, при событии PE_STATUS_CHANGED в этом режиме плагин не уведомляется обо всех пакетах со SNAC (03,0B ) вызвавших это событие). Возможность обработки пакетов плагинами позволит реализовать многое, то что невозможно сделать плагинами сейчас (подмена айди клиента, передача файлов, проверка на невидимость). Плюс использование установки режимов обработки, как предложено мной, не будет оповещать каждый плагин о пакете, а только те плагины, которые обрабатывают пакеты, что не даст сильно вырасти загрузке процессора.
if topic = PM_GET // asking data
BYTE what
if what = PG_REF // получить номер для генерации пакета
possible replies:
PM_DATA INT(ref)

Также необходимо добавить константы для новых статусов, нового состояния видимости, списка проверяемых на невидимость. Сформировать полный список апи от последней версии R&amp;Q и выложить его на сайт.. Если ещё что вспомню - допишу. От писателей плагинов что предложений о новых апи, а от разработчика - ответа о возможности реализации вышеописанных идей в крыске)<br /><br />Post edited by: PRO, at: 2007/07/02 13:11

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
16 года 8 мес. назад #2 от Delphuk
PRO писал:

Сначала о багах - в крыске не работают команды PG_ANDRQ_VER и PG_ANDRQ_VER_STR - тестил на 1056 и 1070, возвращают одно и то же, причем версии там никак нету) PG_CONNECTIONSTATE - возвращает 2 при подключенной крысе, хотя должно 1.

+1 Про PG_CONNECTIONSTATE я Рапиду уже писал, и даже отправлял демо-плаг который показывает некорректное возвращение текущего состояния подключения.
+1 по поводу работы с доп. статусами и создание пунктов в меню.
Ещё хотелось, что бы была возможность полного взаимодействия с ICQ пакетами, интерфейсом и настройками RnQ.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
16 года 8 мес. назад #3 от PRO
Еще пару идей.. Хотелось бы иметь апи для загрузки картинок из темы по их имени в теме, создания типов с собственной картинкой, заголовком (сейчас жирным выделяется), текстом и временем отображения. Хочется иметь возможность чтения информации о клиентах, и изменения своей - добавление и изменение клиенткапсов. Также хотелось бы как-нибудь узнать, находится ли контакт в списке невидимых (не в инвиз-листе, а в списке тех кто в инвизе но спалился) и является ли сообщение оффлайновым

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
16 года 8 мес. назад #4 от OverQuantum
PRO писал:

и является ли сообщение оффлайновым

Для получаемых сообщение это известно - флаг IF_offline.

Questions are plentiful. Answers are few.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
16 года 8 мес. назад #5 от UnQuaiz
прощупал в плагинной системе все.
и вот что я думаю по поводу плагинной системы:
смысла зарываться в количестве констант, и функций для плагинов я не вижу..
необходимо перерабатывать её вместе с ядром.
Делать так как в Миранде это реализовано.
Тогда появится широкий спектр возможностей для плагинописателей, и появится много очень нужных, и полезных плагинов.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
16 года 5 мес. назад #6 от Fr0st
UnQuaiz, дык а как в миранде-то?

Похоже, никто не обратил внимания на мой багрепорт, повторю здесь: попытка установить допстатус командой PC_SET_XSTATUS приводит к ошибке \&quot;Недостаточно памяти\&quot;.

P.S. Для собственного плага наваял обёртку над АПИ в ООП-стиле. Нужно кому-нибудь?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 8 мес. назад #7 от xazlon
Как насчёт чегонить вроде SVN, для контроля версий плагинов (на сайте невозможно разоратся в версиях и тп).
Тоесть чтоб даже через сам клиент можно было проверить обновления на плагины (как в мозиле)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 6 мес. назад #8 от xternalx
хочу чтобы плагиновую систему довели до ума и усовершенствовали. Нынешний функционал очень скудный, а хотелось бы иметь возможность проверять, авторизован ли контакт, занесен ли он в список контактов, чтобы можно было в плагине получить информацию обо всех контактах в контакт листе, а так же получать как можно больше информации о контактах. Так же хотелось бы иметь возможность добавлять кнопки в любое окно крыски - КЛ, либо окно чата.

Чтобы дополнили АПИ функциями для работы с ZIP архивами(ведь крыска все данные хранит именно в них, а еще и темки, и прочее)
Чтобы плагинами можно было менять параметры тем, т.е. менять значения свойств
Чтобы можно было воспроизводить звук средствами крыски(bass.dll не зря ведь лежит рядом -))
Чтобы можно было управлять окошками крыски из плагинов(показывать\скрывать\менять размеры и положение на экране)...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 6 мес. назад - 15 года 6 мес. назад #9 от Fr0st
Вот мои усовершенствования:

1) Для начала я переделал plugin.inc в нормальный Дельфовый юнит.

2) Добавил туда константы для допстатусов:

// X-Statuses
// standard
PX_NONE = 0 ;
PX_ANGRY = 1 ;
PX_DUCK = 2 ;
PX_TIRED = 3 ;
PX_PARTY = 4 ;
PX_BEER = 5 ;
PX_THINKING = 6 ;
PX_EATING = 7 ;
PX_TV = 8 ;
PX_FRIENDS = 9 ;
PX_COFFEE = 10 ;
PX_MUSIC = 11 ;
PX_BUSINESS = 12 ;
PX_CAMERA = 13 ;
PX_FUNNY = 14 ;
PX_PHONE = 15 ;
PX_GAMES = 16 ;
PX_COLLEGE = 17 ;
PX_SHOPPING = 18 ;
PX_SICK = 19 ;
PX_SLEEPING = 20 ;
PX_SURFING = 21 ;
PX_INTERNET = 22 ;
PX_ENGINEERING = 23 ;
PX_TYPING = 24 ;
// non-standard
PX_BARBEQUE = 25 ;
PX_PPC = 26 ;
PX_MOBILE = 27 ;
PX_ZZZ = 28 ;
PX_WC = 29 ;
PX_QUEST = 30 ;
PX_GEOMETRY = 31 ;
PX_LOVE = 32 ;
// standard
PX_CIGARETTE = 33 ;
PX_SEX = 34 ;
// non-standard
PX_SEARCH = 35 ;
PX_DIARY = 36 ;


3) И наконец в модуль RnQUtils (отсутствует в стандартном наборе, однако содержит обертки, существенно облегчающие работу с R&Q. Автор, к сожалению, мне неизвестен, а взял я этот модуль из исходников какого-то плагина) добавил процедуры для установки статуса, допстатуса и невидимости

procedure RQ_SetStatus(Status:byte);
{ PS_ONLINE, PS_OCCUPIED, PS_DND, PS_NA, PS_AWAY, PS_F4C, PS_OFFLINE, PS_UNKNOWN }
begin
callStr(char(PM_CMD)+char(PC_SET_STATUS)+char(Status));
end;

procedure RQ_SetXStatus(XStatus:Byte; Name,Text: string);
{ BYTE xstatus code
ISTRING xstatus name
ISTRING xstatus text }
begin
callStr(char(PM_CMD)+char(PC_SET_XSTATUS)+char(XStatus)+_istring(Name)+_istring(Text));
end;

procedure RQ_SetVisible(Visible:byte);
{ PV_ALL, PV_NORMAL, PV_PRIVACY, PV_INVISIBLE }
begin
callStr(char(PM_CMD)+char(PC_SET_VISIBILITY)+char(Visible));
end;


4) Обнаружил глюк в выложенном СДК: не объявлена константа PE_XSTATUSMSG_SENT, подозреваю, что она совпадает с PE_XSTATUSMSG_SENDING.

5) Предлагаю для ясности сделать следующее:
Объявления констант (plugin.inc) и низкоуровневые функции (pluginutil.pas) объединить в один модуль plugin.pas, а все вспомогательные высокоуровневые функции складывать в другой модуль на основе RnQUtils. Было бы намного логичнее, а то в первый раз сидишь и долго втыкаешь, что там как и откуда берётся.
Свою реализацию со всеми описанными исправлениями и дополнениями прилагаю.

Вложение API_mod.rar не найдено

Вложения:
Последнее редактирование: 15 года 6 мес. назад пользователем Fr0st.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 6 мес. назад #10 от Пушкожук
Пушкожук ответил в теме RE: Предложения по плагинной системе
А я когда-то пытался оптимизировать низкоуровневые функции на Ассемблере... Постараюсь откопать файл :) Fr0st, а можно прямо в твою реализацию изменения внести?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 6 мес. назад #11 от Fr0st
КОнечно, было бы здорово! Правда, не знаю, примут ли нашу паеределку как официальную. Но всё равно, в таком случае будет форк))

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 6 мес. назад - 15 года 6 мес. назад #12 от Toxa
1. не хватает команды PC_SET_CONTACTINFO или хотя бы PC_SET_DISPLAYED_NAME.
2. хорошо бы иметь возможность добавлять командой PC_LIST_ADD в список UINы не целочисленные, а еще и строковые (аля 0spamers).
ps: 2 Fr0st: спасибо за переделку! удобнее стало :)
Последнее редактирование: 15 года 6 мес. назад пользователем Toxa.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 5 мес. назад #13 от Пушкожук
Пушкожук ответил в теме RE: Предложения по плагинной системе
Итак, ассемблерная оптимизация! :) Лучше поздно, чем никогда :laugh:
Однако, из-за нехватки времени свою переделку тестировал очень мало, поэтому поке не рекомендую использовать для финальной компиляции плагинов. Большая просьба: сообщать мне о найденных багах (в эту тему или в ЛС). ;)
P.S. Delphi 2009 пока не поддерживается. Впрочем, в оригинальной версии тоже не было поддержки Delphi 2009...

Вложение API_mod_2.rar не найдено

Вложения:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 5 мес. назад #14 от Toxa
в новом АПИ хотелось бы иметь возможность выстраивать порядок плагинов, чтобы события к ним попадали в определенной очередности.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 5 мес. назад - 15 года 5 мес. назад #15 от Fr0st
Новая версия!
Все изменения касаются модуля RnqUtils

1) Интегрированы асмовые изменения Пушкожука (outBuffer: AnsiString, реализация callStr). Модификации, касающиеся модуля plugin.pas, пока выложены отдельно как непроверенные
2) ContactInfo -> TContactInfo
3) Добавлено очень много функций Get_ххх и Parse_ххх (взято из модуля CallExec плагина RnQ Eye)
4) Облагорожен код, во многих местах убраны ненужные переменные в конструкциях вроде
i:=<...>;
Result:=i;
5) Перед функциями, требующими константу как параметр, поставлены подсказки, какие именно константы им нужны
6) Функции
function RQ_GetChatWindow
function RQ_GetRoasterWindow
function RQ_GetPrefWindow
вызывают
function RQ_GetWindow
с соответствующим параметром, чтобы избежать дублирования кода
Тип результата изменён с integer на boolean, все равно возвращали либо 1, либо 0
7) Функции
function RQ_GetRoasterList:TIntegerDynArray;
function RQ_GetIgnoreList:TIntegerDynArray;
таким же макаром завязаны на
function RQ_GetList(List:integer):TIntegerDynArray;
8) Исправлен баг в RQ_GetContactInfo - вместо уина возвращался бред
9) Новые функции-команды:
	procedure RQ_Quit;
	procedure RQ_Connect;
	procedure RQ_Disconnect;
	function  RQ_CreateChatButton(Proc: pointer; Icon: hIcon; Hint: string; PicName : String = ''):integer;
	procedure RQ_ChangeChatButton(Addr: Integer; Icon: hIcon; Hint:string; PicName : String = '');
	procedure RQ_DeleteChatButton(var Addr: Integer);
	procedure RQ_SendContacts(uin, Flag: integer; contacts:TIntegerDynArray);
	procedure RQ_SendAddedYou(uin: integer);
	procedure RQ_SendMsg(uin, Flag: integer; msg: string);
	procedure RQ_SetAutoMessage(AutoMessage: string);
	procedure RQ_SendAutoMessageRequest(uin: integer);
	function  RQ_AddToList(List: integer; uins: TIntegerDynArray): integer;
	function  RQ_RemoveFromList(List: integer; uins: TIntegerDynArray): integer;

10) RQ_GetRnQVersion переименована в RQ_GetRnQBuild, в соотв. с названием константы


Параллельно развивается моя реализация класса TRnQInterface. Если кого интересует, также могу выложить.

Вложение API_mod-2ccdc3e1fcff1c6fd9018d76354f855e.rar не найдено

Вложения:
Последнее редактирование: 15 года 5 мес. назад пользователем Fr0st.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 5 мес. назад #16 от Пушкожук
Пушкожук ответил в теме RE: Предложения по плагинной системе
Fr0st писал(а):

Параллельно развивается моя реализация класса TRnQInterface. Если кого интересует, также могу выложить.

Хотел бы предупредить, что мои ассемблерные функции нельзя просто так делать методами класса. Дело в том, что если функция является методом класса, то ей неявно передаётся ещё один параметр - Self. Причём, первым. Для высокоуровнего кода это всё равно (компилятор сам всё сделает), а ассемблерные функции придётся немного изменить :) Если надо, могу сделать такие версии функций.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 5 мес. назад #17 от Fr0st
Не, я и не собираюсь все функции запихивать в класс. Это будет просто некая оболочка, упрощающая такие процессы, как создание окна, инициализация, обработка сообщений и прочее.
Насчет функций: как думаешь, что лучше - заменить твоими кодами или сделать {$IFDEF Asm} код на асме {$ELSE} код на паскале ?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 5 мес. назад #18 от Пушкожук
Пушкожук ответил в теме RE: Предложения по плагинной системе
Ну, для начала надо проверить, что мои функции правильно работают :)
Если правильно, то можно сделать {$IFDEF Pascal} код на паскале {$ELSE} код на асме {$ENDIF} - чтобы оптимизации по умолчанию были включены.
Кстати, где-то в RTL видел такое: {$IFDEF PUREPASCAL} код на паскале {$ELSE} код на асме {$ENDIF}. Можно сделать, как там :)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 5 мес. назад #19 от Delphuk
Вот ребята мучаетесь, время тратите, а уже не в столь далёком будущем Рап обещает плагинное апи кординально изменить.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 5 мес. назад #20 от Fr0st
Пушкожук, так кто ж их будет тестировать, если не ты))
Да, с условной будет самое правильное.

Delphuk, так мы ведь и не в курсе... Кардинально, говоришь? Хотелось бы знать, насколько... Не думаю, что на 100% - иначе все плаги придется заново переписывать!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Модераторы: bassvazoozaDelphukdekRapid D
Время создания страницы: 0.513 секунд
Работает на Kunena форум