Contents |
У Konversation передбачено вбудовану підтримку запуску зовнішніх скриптів на основі якої, разом з використанням D-Bus та власних методів D-Bus Konversation, уможливлює керування у найпоширеніших випадках використання скриптів, зокрема показ даних у поточному вікні балачки або керування іншими програмами або навіть самою програмою Konversation. На цій сторінці ви знайдете основі відомості щодо написання скриптів Konversation. Тут наведено лише основні початкові відомості. Дані з використання особливостей мов програмування та операційних систем ви можете здобути самі з відповідної навчальної літератури.
Все, що вам знадобиться, — це текстовий редактор і інтерпретатор мови програмування або скриптів. У Konversation передбачено підтримку будь-якої мови програмування, інтерпретатор якої задовольняє таким вимогам:
qdbus). Ймовірно, краще і безпечніше використовувати вбудовані прив’язки D-Bus, якщо такі є, а не виконання системних викликів для запуску qdbus.
У поточній версії перевірено працездатність скриптів мовами Python, BASH (або командної оболонки) та Perl. Приклади скриптів цими мовами є частиною пакунків з Konversation. Але ви можете скористатися будь-якою іншою мовою, яка задовольняє викладені вище вимоги. На цій сторінці всі приклади наведено мовою Python.
Ймовірно, найтиповішим сценарієм для скрипту є отримання певного тексту для показу його на поточній вкладці Konversation (каналі або особистому діалозі) з даними, які зазвичай надходять із зовнішнього джерела. Джерелом може бути сам скрипт, інша програма (як у скрипті media, включеному у Konversation) або дані інтернету (зокрема отримання даних щодо погоди і показу їх у Konversation). Яким би не було джерело, слід виконати три дії:
У наведеному нижче прикладі скрипт Konversation виконує саме ці три дії.
#!/usr/bin/env python # -*- coding: utf-8 -*- # mood — скрипт Konversation для показу дотепного зауваження щодо настрою користувача. # Використання: /exec mood [рядок_настрою] import sys import subprocess command = ['qdbus', 'org.kde.konversation', '/irc'] argc = len(sys.argv) if argc < 2: command.append("error") text = "Server required" elif argc < 3: command.append("error") text = "Target required" elif argc < 4: command.append("error") text = "No mood given" else: server = sys.argv[1] target = sys.argv[2] mood = sys.argv[3] if mood == "hungry": text = "Голодний! Зараз з’їм вашого коня!" elif mood == "sleepy": text = "Позіхаю, хочу спати." elif mood == "gloomy": text = "Троянди червоні. Нудьга чорна і моя нудьга теж..." elif mood == "happy": text = "Обдумую щасливі думки (навкруги кружляють феї щастя)." elif mood == "hyper": text = "Лише ложка цукру? Мені потрібен цілий пакунок!" elif mood == "excited": text = "Ми вже на місці? Ми вже на місці? Ми вже на місці?" else: text = "А про що ми, власне, вели розмову?" command.append("say") command.append(server) command.append(target) command.append(text) subprocess.Popen(command).communicate()
Якщо програма Konversation викликає зовнішній скрипт, вона має передати йому декілька попередньо визначених аргументів, ось так:
назва_скрипту сервер призначення [додаткові аргументи...]
Аргументи зазвичай зберігаються у збірці (списку або масиві, залежно від мови), яка називається "argv", пронумеровані від 0 до N, де N — кількість аргументів.
uptime та sysinfo.
| Пам’ятайте! |
|---|
| Навіть якщо ваш скрипт не потребує додаткових аргументів або користувач не вказує цих аргументів, Konversation завжди надсилатиме аргументи системи та призначення. Тобто argv[1] і argv[2] завжди буде встановлено. Мінімальною кількістю аргументів завжди буде 3 (не забувайте, що нумерація починається з 0). |
У нашому прикладі скрипту змінна mood, яку вказує користувач як argv[3] скрипту, порівнюється з попередньо визначеними значеннями, після чого змінній text надається відповідне значення. Це простий приклад обробки даних. Ви також можете отримувати дна з попередньо визначеного джерела, подібно до того, як це робить скрипт fortune, або збирати дані з операційної системи, як це робить скрипт sysinfo. Які б дані або текст вам не потрібно було показати у Konversation, їх можна визначити у скрипті.
| Попередження |
|---|
| Невеличке попередження: будьте обережні зі виведенням багаторядкових повідомлень, оскільки на сервері або каналі, якими ви користуєтеся, можуть бути жорсткі правила щодо розмірів повідомлень (захист від переповнення). Якщо розмір даних може бути доволі значним, краще подати їх у іншому форматі (подібно до текстового редактора). |
Тепер, коли потрібні дані оброблено та зібрано, час підготувати їх до надсилання до вікна Konversation. Питання надсилання ми обговоримо у наступному розділі.
Керування Konversation ззовні, зі скрипту чи з командного рядка, пов’язане з використанням методів D-Bus програми. У Konversation передбачено декілька методів, зокрема методи, призначені для показу повідомлень. Надсилання повідомлень D-Bus — справа доволі непроста. На щастя, у Qt передбачено набагато простіший спосіб виконання цього завдання, за допомогою програми "qdbus". Якщо не надто заглиблюватися, всі команди D-Bus, які ми надсилатимемо Konversation з метою показу повідомлень, починатимуться з такого рядка:
qdbus org.kde.konversation /irc
Залежно від типу повідомлення, яке надсилатиме скрипт, до команди буде додано додаткові параметри. Ось приклад:
qdbus org.kde.konversation /irc say сервер призначення повідомлення
Це, ймовірно, команда, яку використовують найчастіше. Команда надсилає «повідомлення» до вікна спілкування «призначення», з’єднаного з сервером «сервер». Якщо повідомлення слід надіслати до того самого вікна, з якого викликано скрипт, скористайтеся змінними argv[1] та argv[2] на місці сервера і призначення, відповідно. Звичайно ж, ви завжди можете змінити призначення на будь-який канал або псевдонім, потрібний вам на певному сервері.
qdbus org.kde.konversation /irc error повідомлення
За допомогою цієї команди можна показати «повідомлення» у тому самому вікні спілкування, з якого було викликано скрипт. Відмінність полягає у тому, що повідомлення не буде надіслано безпосередньо на сервер IRC, бачитиме його лише користувач скрипту. Повідомлення також буде форматовано: "[D-Bus] Помилка: повідомлення". Цей спосіб корисний для інформування користувача про помилки у використанні скрипту або помилки, які виникли під час виконання самого скрипту. Вказувати призначення у команді не потрібно.
qdbus org.kde.konversation /irc sayToAll повідомлення
Надіслати повідомлення до всіх каналів та вікон діалогів на всіх серверах. Слід використовувати обережно з врахуванням правил етикету. Сервер і вікно призначення вказувати не потрібно.
qdbus org.kde.konversation /irc actionToAll повідомлення
Близнюк дії sayToAll. Надсилає повідомлення на всі канали і до всіх вікон діалогів на всіх серверах, але додає перед повідомленням «/me». В результаті користувачі побачать "*ваш_псевдонім повідомлення*". Знову ж таки, врахуйте правила етикету.
Передбачено і інші пов’язані з /irc команди qdbus, деякі з них змінюють стан користувача у мережі замість показу повідомлень. Дослідіть самі всі можливості. За допомогою ще однієї з програм Qt, "qdbusviewer", ви зможете переглянути у графічному інтерфейсі повний список всіх команд керування Konversation та інших програм, які використовують D-Bus. Такі команди знадобляться вам для наступного скриптового сценарію, описаного нижче.
Тепер можна зробити так, щоб скриптом можна було скористатися у Konversation. Ось що треба зробити:
chmod +x script_name. Варто не додавати суфікса до назви вашого скрипту (.sh, .py, .pl тощо), щоб скрипт простіше було викликати.
kde4-config --install data, додавши до назви теки /konversation/scripts/. Порадьтеся з каналом підтримки дистрибутива, якщо і так не вдасться визначити потрібну адресу.
media, оскільки цей скрипти встановлюється разом з Konversation): /exec --showpath media. Зауважте, що якщо існує два скрипти з однаковими назвами, один у домашній теці користувача і один у загальносистемній теці, пріоритет матиме скрипт з теки користувача, саме його адресу буде показано у відповідь на вказану вище команду.
/exec назва_скрипту [додаткові аргументи]
Ця команда викличе ваш скрипт і передасть йому аргументи. Зауважте, що значенням argv[0] завжди буде «назва_скрипту», а назву сервера та вікна спілкування буде передано як argv[1] і argv[2], навіть якщо ви не вкажете значення цих змінних у вашій команді. Тому додаткові аргументи буде передано як argv[3] тощо.
/назва_скрипту [аргументи]
Для скрипту, описаного у нашому попередньому прикладі, назвою буде "mood", а викликати скрипт можна буде командою /mood [настрій] або /exec mood [настрій], ось так:
/mood gloomy
Це в основному все, що вам потрібно знати для створення скрипту Konversation. Щоб додати ще трохи цікавинки, розгляньмо інший поширений випадок використання скриптів.
Завдяки D-Bus та тому, що у багатьох програмах KDE передбачено можливість використання методів D-Bus, ви можете керувати будь-якою програмою KDE безпосередньо з вікна Konversation. Навіть без D-Bus ви, за допомогою свого скрипту, можете запускати, зупиняти та навіть керувати іншими програмами простою командою Konversation. Таким чином можна виконувати безліч завдань, зокрема надсилати команду емулятору термінала, відкривати повідомлення щодо вад у вікні переглядача за номером звіту щодо вади (як це реалізовано у скрипті bug) або просто виконати системну команду (і можливо показати результати її виконання, як це робить скрипт cmd).
Наведений вище скрипт реалізує першу можливість. Він розкриває вікно Yakuake і виконує у ньому вказану користувачем команду. Скрипт доволі примітивний: він не показуватиме виведених даних користувачеві, хіба що станеться помилка у самому скрипті.
#!/usr/bin/env python # yakrun — скрипт Konversation, який виконує вказану користувачем команду у Yakuake і перемикає стан Yakuake # Використання: /exec yakrun [команда] import sys import subprocess errorCommand = ['qdbus', 'org.kde.konversation', '/irc', 'error'] toggleCommand = ['qdbus', 'org.kde.yakuake', '/yakuake/window', 'toggleWindowState'] runCommand = ['qdbus', 'org.kde.yakuake', '/yakuake/sessions', 'runCommand'] argc = len(sys.argv) if argc < 4: text = "Не вказано команди." errorCommand.append(text) subprocess.Popen(errorCommand).communicate() else: command = " ".join(sys.argv[3:]) runCommand.append(command) subprocess.Popen(toggleCommand).communicate() subprocess.Popen(runCommand).communicate()