স্লাশ কমান্ড
কাস্টম স্লাশ কমান্ডের মাধ্যমে ব্যবহারকারীরা মেসেজ বক্সে /কিছু লিখে আপনার সার্ভিসকে কল করতে পারেন। Antimatter কমান্ডটি আপনার URL-এ পাঠায় এবং আপনার উত্তরটি কেবল সেই ব্যক্তিকে বা পুরো চ্যানেলে প্রদর্শন করে।
স্লাশ কমান্ড কীভাবে কাজ করে
- কেউ
/weather Parisলিখে পাঠান। টেক্সটটি পোস্ট করা হয় না। - Antimatter কমান্ডের URL-এ একটি HTTP রিকোয়েস্ট পাঠায়, যেখানে কে লিখেছে, কোথায় লিখেছে এবং ট্রিগারের পরের টেক্সট থাকে।
- আপনার সার্ভিস রিকোয়েস্ট টাইমআউটের (ডিফল্ট ৩০ সেকেন্ড) মধ্যে একটি মেসেজ দিয়ে উত্তর দেয়।
- Antimatter উত্তরটি প্রদর্শন করে: কেবল সেই ব্যক্তিকে (এফিমেরাল) বা চ্যানেলে সবাইকে।
কমান্ডগুলো একটি কমিউনিটির অংশ, এবং একটি ট্রিগার ওয়ার্ড কমিউনিটির মধ্যে ইউনিক। /join, /msg বা /away এর মতো বিল্ট-ইন কমান্ডগুলো বদলানো যায় না। অ্যাপস (প্লাগইন)ও কমান্ড নিবন্ধন করতে পারে; দেখুন সার্ভার অংশ।
কমান্ড তৈরি করুন
কাস্টম স্ল্যাশ কম্যান্ডসমূহ ডিফল্টভাবে সক্রিয় থাকে (সিস্টেম কনসোল › ইন্টিগ্রেশনসমূহ › ইন্টিগ্রেশন ম্যানেজমেন্ট-এ কাস্টম স্ল্যাশ কম্যান্ড সক্রিয় করুন, ServiceSettings.EnableCommands)। কমিউনিটি অ্যাডমিন এবং সিস্টেম অ্যাডমিনরা ডিফল্টভাবে এগুলো তৈরি করতে পারেন।
- কমিউনিটি মেনু খুলুন, তারপর টিম সেটিংস-এ ক্লিক করুন, এর ট্যাবগুলোর শেষে ইন্টিগ্রেশনসমূহ-এ ক্লিক করুন, তারপর স্লাশ কমান্ডসমূহ এবং স্ল্যাশ কম্যান্ড যোগ করুন।
- শিরোনাম এবং বর্ণনা (ইন্টিগ্রেশন পেজে দেখানো হয়) পূরণ করুন।
- কমান্ড ট্রিগার ওয়াড লিখুন, স্ল্যাশ ছাড়া এবং স্পেস ছাড়া, যেমন
weather। - রিকোয়েস্ট URL লিখুন এবং রিকোয়েস্ট মেথড নির্বাচন করুন: POST (ডিফল্ট) অথবা GET।
- ঐচ্ছিকভাবে রেসপন্স ইউজারনেম এবং রেসপন্স আইকন সেট করুন। এগুলো শুধুমাত্র তখন ব্যবহৃত হয় যখন সার্ভার ইন্টিগ্রেশনসমূহকে নাম এবং আইকন পরিবর্তন করতে অনুমতি দেয় (দেখুন নাম এবং আইকন)।
- যখন মানুষ
/টাইপ করবে তখন কম্যান্ডটি তালিকাভুক্ত করার জন্য অটো-কমপ্লিট টিক করুন, একটি অটো-কমপ্লিট হিন্ট (যেমন এর আর্গুমেন্ট,[city]) এবং একটি অটো-কমপ্লিট বর্ণনা সহ। - সংরক্ষণ করুন নির্বাচন করুন এবং দেখানো টোকেনটি কপি করুন। আপনার সার্ভিস থেকে রিকোয়েস্ট আসছে কিনা তা যাচাই করতে আপনার সার্ভিস এটি ব্যবহার করে।
API-র মাধ্যমে: POST /api/v4/commands ব্যবহার করে {"team_id", "trigger", "url", "method": "P", "display_name", "description", "auto_complete": true, "auto_complete_hint", "auto_complete_desc", "username", "icon_url"} পাঠান। মেথড P মানে POST, আর G মানে GET। PUT /api/v4/commands/{command_id}/regen_token দিয়ে নতুন টোকেন তৈরি করা যায়।
আপনার সার্ভিস যে রিকোয়েস্ট পায়
POST কমান্ড একটি ফর্ম-এনকোডেড বডি পাঠায় (application/x-www-form-urlencoded); GET কমান্ড একই ফিল্ডগুলো কোয়েরি স্ট্রিং-এ পাঠায়। টোকেনটি Authorization: Token <token> হেডারেও থাকে।
| ফিল্ড | মান |
|---|---|
token | কমান্ডের টোকেন। প্রতিটি রিকোয়েস্টে এটি যাচাই করুন। |
command | স্ল্যাশসহ ট্রিগার, যেমন /weather। |
text | ট্রিগারের পরের সবকিছু, যেমন Paris। |
user_id, user_name | কে এটি চালিয়েছে। |
channel_id, channel_name | কোথায় এটি চালানো হয়েছে। |
team_id, team_domain | কমিউনিটির আইডি এবং URL-এর নাম। |
root_id | থ্রেড, যদি এটি কোনো থ্রেডের রিপ্লাই বক্সে চালানো হয়। |
trigger_id | আপনার উত্তর দিয়ে একটি ডায়ালগ খোলা যায় (দেখুন Dialogs)। এটি খুব ছোট সময়ের জন্যই বৈধ। |
response_url | পরে আরও উত্তর পাঠানোর জন্য একটি URL (দেখুন Delayed answers)। |
user_mentions, user_mentions_ids, channel_mentions, channel_mentions_ids | যদি টেক্সটে এমন কেউ বা পাবলিক চ্যানেল থাকে, তবে তাদের উল্লেখ করা হয়। চ্যানেলগুলো #channel-name বা ~channel-name হিসেবে লেখা হলেও গণনা করা হয়। |
response_url তৈরি করে।রেসপন্স
JSON (Content-Type: application/json) সহ 200 উত্তর দিন:
{
"response_type": "in_channel",
"text": "Paris: 18 °C, light rain",
"attachments": []
}
| ফিল্ড | অর্থ |
|---|---|
response_type | ephemeral (ডিফল্ট): শুধুমাত্র যে ব্যক্তি কমান্ডটি চালিয়েছে তার কাছে উত্তর দেখা যায়, আর রিলোডের পর এটি সংরক্ষিত থাকে না। in_channel: উত্তরটি চ্যানেলে পোস্ট করা হয়। |
text, attachments | ওয়েবহুক-এর মতো মেসেজ: Markdown টেক্সট এবং attachments, বাটন এবং মেনুসহ। |
username, icon_url | দেখানোর জন্য নাম এবং ছবি, যদি ওভাররাইড অনুমোদিত হয়। কমান্ডের নিজস্ব সেটিংস এইগুলোর চেয়ে অগ্রাধিকার পায়। |
channel_id | উত্তরটি অন্য চ্যানেলে পোস্ট করুন, যেখানে সেই ব্যক্তি সদস্য হতে হবে। |
goto_location | কমান্ড চালানোর পর খোলার জন্য একটি URL। |
props, type | ওয়েবহুকের মতো অতিরিক্ত বৈশিষ্ট্য এবং কাস্টম পোস্ট টাইপ। একটি ফোরাম চ্যানেলে পোস্ট করা রেসপন্সের জন্য props.am_thread_title প্রয়োজন, অন্যথায় তা প্রত্যাখ্যান করা হবে। |
extra_responses | আরও উত্তর, প্রতিটিতে একই ফিল্ডসহ, প্রথমটির পর পোস্ট করা হয়। |
skip_slack_parsing | true টেক্সটটি যেমন আছে তেমন রাখে, Slack-স্টাইল লিংক এবং মেনশনসমূহ রূপান্তরিত না করে। |
JSON নয় এমন রেসপন্স একটি ইফিমেরাল মেসেজ হিসেবে দেখানো হয়, যার টেক্সট হিসেবে বডি ব্যবহার করা হয়। 204 No Content কিছুই দেখায় না। 200–299-এর বাইরের যেকোনো স্ট্যাটাস ব্যক্তিটিকে একটি এরর দেখায়।
উদাহরণ সার্ভিস
Python-এ একটি ন্যূনতম কমান্ড সার্ভিস, শুধুমাত্র স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে:
import hmac
import json
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import parse_qs
TOKEN = "the token shown when you saved the command"
class Handler(BaseHTTPRequestHandler):
def do_POST(self):
body = self.rfile.read(int(self.headers["Content-Length"])).decode()
form = {key: values[0] for key, values in parse_qs(body).items()}
if not hmac.compare_digest(form.get("token", ""), TOKEN):
self.send_response(401)
self.end_headers()
return
answer = {
"response_type": "ephemeral",
"text": f"Hello @{form['user_name']}, you asked for: {form.get('text', '')}",
}
data = json.dumps(answer).encode()
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(data)
HTTPServer(("0.0.0.0", 8080), Handler).serve_forever()
যদি সার্ভিসটি একটি প্রাইভেট নেটওয়ার্ক ঠিকানায় চলে, তবে সিস্টেম অ্যাডমিনকে অপপ্রমাণিত অভ্যন্তরীণ সংযোগ অনুমোদন করুন (ServiceSettings.AllowedUntrustedInternalConnections)-এ এটি অনুমোদন করতে হবে।
বিলম্বিত উত্তর
যেসব কাজের জন্য টাইমআউটের চেয়ে বেশি সময় লাগে, সেগুলোর জন্য একবারেই একটি উত্তর দিন (যেমন একটি এফিমেরাল "কাজ করছি…"), তারপর response_url-এ আসল উত্তরটি POST করুন। এতে রেসপন্সের মতো একই JSON লাগে, এবং কমান্ডের ৩০ মিনিটের মধ্যে সর্বোচ্চ ৫ বার এটি কাজ করে।
curl -X POST "$RESPONSE_URL" -H 'Content-Type: application/json' \
-d '{"response_type": "in_channel", "text": "Report ready: https://reports.example.com/42"}'
API দিয়ে একটি কমান্ড চালান
স্ক্রিপ্ট এবং বট যেকোনো কমান্ড, বিল্ট-ইন বা কাস্টম, এমনভাবে চালাতে পারে যেন তারা নিজেই তা টাইপ করেছে:
curl -X POST https://chat.example.com/api/v4/commands/execute \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"channel_id": "'$CHANNEL_ID'", "command": "/weather Paris"}'
GET /api/v4/teams/{team_id}/commands/autocomplete একটি কমিউনিটিতে যেসব কমান্ড মানুষ অটো-কমপ্লিট করতে পারে তা তালিকাভুক্ত করে।
অটো-কমপ্লিট
ইন্টিগ্রেশন পেজে তৈরি করা কমান্ডগুলো তাদের ট্রিগার, হিন্ট এবং বর্ণনা সহ অটো-কমপ্লিট হয়। অ্যাপস দ্বারা নিবন্ধিত কমান্ডগুলো AutocompleteData ব্যবহার করে তাদের সাবকমান্ড এবং আর্গুমেন্টের বিস্তারিত বর্ণনা দিতে পারে, যা model.NewAutocompleteData(trigger, hint, helpText) থেকে আসে:
AddCommand(sub)একটি সাবকমান্ড যোগ করে, যা নিজেই একটিAutocompleteData।AddTextArgument(helpText, hint, pattern)মুক্ত টেক্সট যোগ করে।AddStaticListArgument(helpText, required, items)AutocompleteListItem{Item, Hint, HelpText}এর একটি নির্দিষ্ট তালিকা প্রদান করে।AddDynamicListArgument(helpText, url, required)মানুষ টাইপ করার সময় আপনার অ্যাপ থেকে পরামর্শ চায়। URLটি আপনার অ্যাপের একটি রুট, যেমন/plugins/com.example.weather/cities। এটি ইউজার, চ্যানেল এবং কমিউনিটি গ্রহণ করে এবং{"Item", "Hint", "HelpText"}এর একটি JSON তালিকা ফেরত দেয়।
Named… ভ্যারিয়েন্ট (AddNamedTextArgument এবং অন্যান্য) --name value ফ্ল্যাগ যোগ করে। উভয় ওয়েব ইন্টারফেসেই এই প্রস্তাবনাগুলো দেখা যায়। স্পেস থাকা একটি মানকে কোট করা যেতে পারে যাতে এটি একটি আর্গুমেন্ট হিসেবে অটোকমপ্লিট হয়, যেমন --name "my remote": ডাবল কোট সব কমান্ডের জন্য কাজ করে, এবং Antimatter-এর নিজস্ব কমান্ডগুলো যা ফ্ল্যাগ নেয়, সেগুলো সিঙ্গেল বা কার্লি কোটও গ্রহণ করে।
যখন কেউ একটি কমান্ড টাইপ করে, Fusion সেই কমান্ড এবং এর প্রতিটি আর্গুমেন্টকে একটি ব্লক হিসেবে দেখায়, যেখানে টাইপ করা আর্গুমেন্টটি হাইলাইট করা থাকে এবং এর সাথে হেল্প টেক্সট থাকে। আর্গুমেন্টগুলো AutocompleteData-এর থেকে আসে, অথবা না থাকলে হিন্ট থেকে আসে: যেমন @[username]... #[channel] হিন্টে, @ দিয়ে শুরু হওয়া শব্দগুলো মানুষের আর্গুমেন্টে যায় এবং # দিয়ে শুরু হওয়া শব্দগুলো চ্যানেলের আর্গুমেন্টে যায়, তাদের ক্রম যাই হোক না কেন; ... এর অর্থ হলো আর্গুমেন্টটি পুনরাবৃত্ত হয়, এবং শেষ আর্গুমেন্টটি বাকি টেক্সট গ্রহণ করে।
আর্গুমেন্টে চ্যানেল
কমান্ডের আর্গুমেন্টে, @ মানুষের জন্য সাজেশন দেয়, # চ্যানেলের জন্য সাজেশন দেয় এবং #channel-name হিসেবে সম্পূর্ণ করে, আর ~ ~channel-name হিসেবে সম্পূর্ণ করে। Antimatter-এর ওয়েব ইন্টারফেস এবং মোবাইল অ্যাপ চ্যানেলের লিংক # দিয়ে লেখে, তাই যে কমান্ড চ্যানেল গ্রহণ করে, সেটিকে উভয় রূপ গ্রহণ করা উচিত: বিল্ট-ইন /join, /mute এবং /invite কমান্ডগুলো এটি করে, এবং তাদের হিন্টে #[channel] লেখা থাকে।