Предложения по плагинной системе
- PRO
- Не в сети
- Elite Member
- Сообщений: 300
- Спасибо получено: 0
Сначала о багах - в крыске не работают команды 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&Q и выложить его на сайт.. Если ещё что вспомню - допишу. От писателей плагинов что предложений о новых апи, а от разработчика - ответа о возможности реализации вышеописанных идей в крыске)<br /><br />Post edited by: PRO, at: 2007/07/02 13:11
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Delphuk
- Не в сети
- Moderator
+1 Про PG_CONNECTIONSTATE я Рапиду уже писал, и даже отправлял демо-плаг который показывает некорректное возвращение текущего состояния подключения.Сначала о багах - в крыске не работают команды PG_ANDRQ_VER и PG_ANDRQ_VER_STR - тестил на 1056 и 1070, возвращают одно и то же, причем версии там никак нету) PG_CONNECTIONSTATE - возвращает 2 при подключенной крысе, хотя должно 1.
+1 по поводу работы с доп. статусами и создание пунктов в меню.
Ещё хотелось, что бы была возможность полного взаимодействия с ICQ пакетами, интерфейсом и настройками RnQ.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- PRO
- Не в сети
- Elite Member
- Сообщений: 300
- Спасибо получено: 0
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- OverQuantum
- Не в сети
- Platinum Member
Для получаемых сообщение это известно - флаг IF_offline.и является ли сообщение оффлайновым
Questions are plentiful. Answers are few.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- UnQuaiz
- Не в сети
- New Member
- Сообщений: 16
- Спасибо получено: 0
и вот что я думаю по поводу плагинной системы:
смысла зарываться в количестве констант, и функций для плагинов я не вижу..
необходимо перерабатывать её вместе с ядром.
Делать так как в Миранде это реализовано.
Тогда появится широкий спектр возможностей для плагинописателей, и появится много очень нужных, и полезных плагинов.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Fr0st
- Не в сети
- Platinum Member
- Сообщений: 360
- Спасибо получено: 0
Похоже, никто не обратил внимания на мой багрепорт, повторю здесь: попытка установить допстатус командой PC_SET_XSTATUS приводит к ошибке \"Недостаточно памяти\".
P.S. Для собственного плага наваял обёртку над АПИ в ООП-стиле. Нужно кому-нибудь?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- xazlon
- Не в сети
- New Member
- Сообщений: 11
- Спасибо получено: 0
Тоесть чтоб даже через сам клиент можно было проверить обновления на плагины (как в мозиле)
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- xternalx
- Не в сети
- Elite Member
- Сообщений: 201
- Спасибо получено: 0
Чтобы дополнили АПИ функциями для работы с ZIP архивами(ведь крыска все данные хранит именно в них, а еще и темки, и прочее)
Чтобы плагинами можно было менять параметры тем, т.е. менять значения свойств
Чтобы можно было воспроизводить звук средствами крыски(bass.dll не зря ведь лежит рядом -))
Чтобы можно было управлять окошками крыски из плагинов(показывать\скрывать\менять размеры и положение на экране)...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Fr0st
- Не в сети
- Platinum Member
- Сообщений: 360
- Спасибо получено: 0
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 не найдено
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Пушкожук
- Не в сети
- Platinum Member
- Сообщений: 832
- Спасибо получено: 1
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Fr0st
- Не в сети
- Platinum Member
- Сообщений: 360
- Спасибо получено: 0
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Toxa
- Не в сети
- Platinum Member
- Сообщений: 368
- Спасибо получено: 0
2. хорошо бы иметь возможность добавлять командой PC_LIST_ADD в список UINы не целочисленные, а еще и строковые (аля 0spamers).
ps: 2 Fr0st: спасибо за переделку! удобнее стало
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Пушкожук
- Не в сети
- Platinum Member
- Сообщений: 832
- Спасибо получено: 1
Однако, из-за нехватки времени свою переделку тестировал очень мало, поэтому поке не рекомендую использовать для финальной компиляции плагинов. Большая просьба: сообщать мне о найденных багах (в эту тему или в ЛС).
P.S. Delphi 2009 пока не поддерживается. Впрочем, в оригинальной версии тоже не было поддержки Delphi 2009...
Вложение API_mod_2.rar не найдено
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Toxa
- Не в сети
- Platinum Member
- Сообщений: 368
- Спасибо получено: 0
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Fr0st
- Не в сети
- Platinum Member
- Сообщений: 360
- Спасибо получено: 0
Все изменения касаются модуля 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 не найдено
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Пушкожук
- Не в сети
- Platinum Member
- Сообщений: 832
- Спасибо получено: 1
Хотел бы предупредить, что мои ассемблерные функции нельзя просто так делать методами класса. Дело в том, что если функция является методом класса, то ей неявно передаётся ещё один параметр - Self. Причём, первым. Для высокоуровнего кода это всё равно (компилятор сам всё сделает), а ассемблерные функции придётся немного изменить Если надо, могу сделать такие версии функций.Параллельно развивается моя реализация класса TRnQInterface. Если кого интересует, также могу выложить.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Fr0st
- Не в сети
- Platinum Member
- Сообщений: 360
- Спасибо получено: 0
Насчет функций: как думаешь, что лучше - заменить твоими кодами или сделать {$IFDEF Asm} код на асме {$ELSE} код на паскале ?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Пушкожук
- Не в сети
- Platinum Member
- Сообщений: 832
- Спасибо получено: 1
Если правильно, то можно сделать {$IFDEF Pascal} код на паскале {$ELSE} код на асме {$ENDIF} - чтобы оптимизации по умолчанию были включены.
Кстати, где-то в RTL видел такое: {$IFDEF PUREPASCAL} код на паскале {$ELSE} код на асме {$ENDIF}. Можно сделать, как там
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Delphuk
- Не в сети
- Moderator
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Fr0st
- Не в сети
- Platinum Member
- Сообщений: 360
- Спасибо получено: 0
Да, с условной будет самое правильное.
Delphuk, так мы ведь и не в курсе... Кардинально, говоришь? Хотелось бы знать, насколько... Не думаю, что на 100% - иначе все плаги придется заново переписывать!
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.