Tkabber Wiki

Команды
Login

Команды

Материал из Tkabber Wiki

Статья ещё не дописана, см. TODO: дописать статью.

Содержание

Общая информация

Не все команды имеют «защиту от дурака». В данном списке указаны только разумные наборы параметров. В случае использования другого набора параметров команда может быть отправлена собеседнику (как обычное сообщение), может возникнуть исключение (на уровне интерпретатора tcl), может быть выведено сообщение об ошибке под сообщениями активного окна, может не случиться ничего. Эти ситуации никак не оговариваются в данном списке, поскольку недостатки лучше исправлять, а не документировать.

Аргументы-слова не должны содержать пробельных символов (например, пробела или перевода строки) и должны разделяться строго одним пробелом. В некоторых случаях аргумент представляет собой произвольный текст или текст, не содержащий символа перевода строки. Типы аргументов указаны в описаниях к командам.

Аргументы команд, записанные в квадратных скобках, являются необязательными (т. е. могут присутствовать или не присутствовать в записи команды). Иногда наличие или отсутствие аргумента влияет на семантику команды, например на то, отображается некоторое свойство командой или изменяется.

В окне чата работает автодополнение по клавише Tab. Его можно использовать для дополнения псевдонима участника конференции, команды, аргумента команды и, иногда, чего-нибудь другого (см., например, плагин Juick).

Для формалистов. Текст команд можно воспринимать как запись шаблона команды в форме расширенной БНФ, причём слова, начинающиеся с символа '/', а также '\n' являются терминалами, остальные — нетерминалами, формат нетерминалов определяется типом нетерминала как аргумента. Разделителем между командой и аргументом, а также между аргументами-словами является пробел. Если между идентификаторами (терминалами или нетерминалами) присутствует терминал '\n', то других разделитей не подразумевается.

Встроенные команды

/admin nickname ['\n' reason]

/ban nickname ['\n' reason]

/banjid jid ['\n' reason]

/deadmin nickname ['\n' reason]

/demember nickname ['\n' reason]

/demoderator nickname ['\n' reason]

/devoice nickname ['\n' reason]

/disco [jid]

/exec command

Синтаксис, вообще говоря, отличается от привычного по совместимым с Bourne Shell командным интерпретаторам. Например, несколько слов, разделённых пробелами или символами перевода строки, объединяются в один аргумент с помощью фигурных скобок, а не кавычек. Подробнее см. в “man n exec”. Можно использовать синтаксис системного командного интерпретатора с помощью такого приёма: “/exec sh -c {some command}”

/invite jid ['\n' reason]

/join [room [password]]

/kick nickname ['\n' reason]

/last [user]

Раскрытие аргумента [user]

Для краткости изложения будем указывать bare JID и full JID собеседника (или конференции) как chat_jid и chat_jid/resource соответственно.

Команда /last в конференции:

Команда /last user в конференции:

Команда /last в обычном чате:

Команда /last user в обычном чате:

(!) Сделать: Было бы неплохо проверять, совпадает ли user с псевдонимом одного из участников конференции и, если нет, то попытаться отождествить user с псевдонимом пользователя из ростера или, если и это не удалось, делать запрос по JID'у user. Да и команду было бы неплохо разбить на две или три более осмысленных, при этом для каждой команды осуществлять приведению JID'а к необходимому виду, а для uptime — принимать только обращения по JID'ам вида domain.tld.

/leave [status]

/me text

/member nickname ['\n' reason]

/moderator nickname ['\n' reason]

/msg nickname '\n' body

/nick nickname

/open user_a

/part [status]

/ping [user]

/rejoin

/subject [text]

/time [user]

/topic [text]

/unban jid

/vcard [user_b]

Раскрытие аргумента [user_b]

Порядок раскрытия аргумента user_b (буква b от bare JID) и интерпретации его отсутствия несколько отличнен от подобного для команды /last [user].

Команда /vcard [user_b] в конференции: отличий от [user] нет, т. е. запрос к chat_jid или chat_jid/user_b.

Команда /vcard в обычном чате:

Команда /vcard user_b:

/version [user]

/voice nickname ['\n' reason]

/whois nickname

Ссылки

TODO: дописать статью

$ ls -1
tkabber
tkabber-contrib
tkabber-plugins

$ for dir in `ls -1`; do (cd $dir; fossil info | grep check-ins:); done
check-ins:    1936
check-ins:    565
check-ins:    632

$ grep -Rin chat_send_message_hook
...skip processed...
tkabber/README:2415:   chat_send_message_hook $chatid $user $body $type
tkabber/doc/tkabber.xml:2337:chat_send_message_hook $chatid $user $body $type
tkabber/doc/tkabber.html:1692:chat_send_message_hook $chatid $user $body $type
tkabber/chats.tcl:927:    hook::run chat_send_message_hook $chatid $user $body $type
tkabber/chats.tcl:1031:        hook::run chat_send_message_hook $chatid [connection_user $xlib] \
tkabber/plugins/chat/muc_ignore.tcl:94:    hook::add chat_send_message_hook \
tkabber/plugins/chat/events.tcl:268:hook::add chat_send_message_hook \
tkabber/plugins/chat/history.tcl:45:hook::add chat_send_message_hook [namespace current]::add_body_to_history 12
tkabber/plugins/chat/send_message.tcl:12:    if {[hook::is_flag chat_send_message_hook send]} {
tkabber/plugins/chat/send_message.tcl:40:    hook::unset_flag chat_send_message_hook send
tkabber/plugins/chat/send_message.tcl:43:hook::add chat_send_message_hook [namespace current]::send_message 90
tkabber/plugins/chat/chatstate.tcl:64:hook::add chat_send_message_hook \
tkabber/plugins/chat/chatstate.tcl:282:hook::add chat_send_message_hook \
tkabber/plugins/chat/shuffle.tcl:112:hook::add chat_send_message_hook \
tkabber/plugins/chat/draw_message.tcl:7:    if {$type ne "groupchat" && [hook::is_flag chat_send_message_hook draw]} {
tkabber/plugins/chat/draw_message.tcl:11:    hook::unset_flag chat_send_message_hook draw
tkabber/plugins/chat/draw_message.tcl:14:hook::add chat_send_message_hook [namespace current]::draw_message 91
tkabber/plugins/chat/abbrev.tcl:79:hook::add chat_send_message_hook \
tkabber/plugins/chat/empty_body.tcl:14:hook::add chat_send_message_hook [namespace current]::check_send_empty_body 10
tkabber/plugins/chat/clear.tcl:26:hook::add chat_send_message_hook \
tkabber-contrib/openhistory/openhistory.tcl:8:    hook::add chat_send_message_hook [namespace current]::handle_command 15
tkabber-contrib/autoanswer/autoanswer.tcl:232:	hook::add chat_send_message_hook  \
tkabber-contrib/juick/juick.tcl:108:    hook::add chat_send_message_hook   \
tkabber-contrib/juick/juick.tcl:151:    hook::remove chat_send_message_hook   \
tkabber-contrib/bldjid2/bldjid2.tcl:186:    hook::add chat_send_message_hook \
tkabber-contrib/bldjid2/bldjid2.tcl:208:    hook::remove chat_send_message_hook \
tkabber-contrib/reminder/reminder.tcl:71:    hook::add chat_send_message_hook \
tkabber-contrib/reminder/reminder.tcl:85:    hook::remove chat_send_message_hook \
tkabber-contrib/urlcmd/urlcmd.tcl:25:	hook::add chat_send_message_hook \
tkabber-contrib/bldjid/bldjid.tcl:138:	hook::add chat_send_message_hook \
tkabber-contrib/bldjid/bldjid.tcl:162:	hook::remove chat_send_message_hook \
tkabber-contrib/ibuddy/ibuddy.tcl:35:hook::add chat_send_message_hook [list [namespace current]::ibuddy::udp_puts "MACRO_GREEN"]
tkabber-contrib/tastebin/tastebin.tcl:48:	hook::add chat_send_message_hook ${NS}::handle_command
tkabber-plugins/tclchat/tclchat_commands.tcl:12:    hook::add chat_send_message_hook \
tkabber-plugins/tclchat/tclchat_commands.tcl:19:    hook::remove chat_send_message_hook \
tkabber-plugins/otr/otr.tcl:1283:        hook::unset_flag chat_send_message_hook draw
tkabber-plugins/socials/socials.tcl:42:    hook::add chat_send_message_hook \
tkabber-plugins/socials/socials.tcl:52:    hook::remove chat_send_message_hook \
tkabber-plugins/socials/socials.tcl:179:            #hook::run chat_send_message_hook $chatid $user $s $type
tkabber-plugins/bc/bc.tcl:62:    hook::add chat_send_message_hook \
tkabber-plugins/bc/bc.tcl:77:    hook::remove chat_send_message_hook \
tkabber-plugins/presencecmd/presencecmd.tcl:31:    hook::add chat_send_message_hook [namespace current]::handle_command 15
tkabber-plugins/presencecmd/presencecmd.tcl:36:    hook::remove chat_send_message_hook [namespace current]::handle_command 15
tkabber-plugins/quiz/quiz.tcl:68:    hook::add chat_send_message_hook \
tkabber-plugins/quiz/quiz.tcl:87:    hook::remove chat_send_message_hook \

Немного мыслей о развитии механизма команд

Проверку синтаксиса, лучше делать не для каждой команды индивидуально, а централизованно. Регистрируем набор команд со специфицированным форматом аргументов. При отправке сообщения проверяем ввод на соответствие данному формату, осуществляя в сущности ту же работу, которую делает парсер команд shell'а. Остаётся вопрос, что делать, если пользователем набрана существующая команда с неправильным форматом аргументов или несуществующая команда. Я думаю, все сообщения, начинающиеся с символа '/', нужно либо обрабатывать как команды, либо выдавать сообщение о невозможности выполнить команду. А для возможности отправки сообщения с первым символом '/' предусмотреть специальный хак, например команду //.

Ещё в тему единого парсера команд: тип аргумента user, раскрывается как в команде /last [user], и тип user_b, раскрывается как в команде /vcard [user_b].