सलाश कमैंड

कस्टम सलाश कमैंड लोगों को मैसेज बॉक्स में /something टाइप करके आपकी सर्विस को कॉल करने की अनुमति देता है। Antimatter कमैंड को आपके URL पर भेजता है और आपके जवाब को दिखाता है, या तो केवल उस व्यक्ति को या पूरे चैनल में।

सलाश कमैंड कैसे काम करता है

  1. किसी व्यक्ति ने /weather Paris टाइप किया और भेज दिया। टेक्स्ट पोस्ट नहीं होता है।
  2. Antimatter कमैंड के URL पर एक HTTP अनुरोध भेजता है, जिसमें यह जानकारी होती है कि कौन टाइप किया, कहाँ, और ट्रिगर के बाद का टेक्स्ट।
  3. आपकी सर्विस अनुरोध टाइमआउट (डिफ़ॉल्ट रूप से 30 सेकंड) के भीतर एक मैसेज के साथ जवाब देती है।
  4. Antimatter जवाब दिखाता है: केवल उस व्यक्ति को (एफिमेरल) या चैनल में सभी के लिए।

कमैंड किसी कम्युनिटी से जुड़े होते हैं, और ट्रिगर वर्ड उसमें अद्वितीय होता है। /join, /msg या /away जैसे बिल्ट-इन कमैंड को बदला नहीं जा सकता। ऐप्स (प्लग-इन्स) भी कमैंड रजिस्टर कर सकते हैं; देखें सर्विस का हिस्सा।

कमैंड बनाएं

कस्टम स्लैश कमांड डिफ़ॉल्ट रूप से सक्रिय होते हैं (सिस्टम कंसोल › इंटीग्रेशन › इंटीग्रेशन प्रबंधन में कस्टम स्लैश कमांड सक्षम करें, ServiceSettings.EnableCommands)। कम्युनिटी एडमिन और सिस्टम एडमिन डिफ़ॉल्ट रूप से इन्हें बना सकते हैं।

  1. ऊपर दाईं ओर अपने अवतार पर क्लिक करें, फिर इंटीग्रेशन › स्लैश कमांड, और फिर स्लैश कमंड जोड़ें चुनें।
  2. शीर्षक और विवरण भरें (यह इंटीग्रेशन पेज पर दिखता है)।
  3. कमांड ट्रिगर शब्द दर्ज करें, स्लैश और स्पेस के बिना, उदाहरण के लिए weather।
  4. रिक्वेस्ट URL दर्ज करें और रिक्वेस्ट विधि चुनें: POST (डिफ़ॉल्ट) या GET।
  5. वैकल्पिक रूप से रिस्पॉन्स यूज़रनेम और प्रतिक्रिया आइकॉन सेट करें। ये तब ही उपयोग में आते हैं जब सर्वर इंटीग्रेशन को नामों और आइकॉनों को ओवरराइड करने की अनुमति देता है (देखें नाम और आइकॉन)।
  6. जब लोग / टाइप करते हैं, तो कमांड की सूची दिखाने के लिए ऑटो-कंप्लीट पर टिक करें, साथ में ऑटोकम्प्लीट हिंट (इसके आर्गुमेंट, जैसे [city]) और ऑटोकम्प्लीट विवरण।
  7. सहेजें चुनें, और दिखाई देने वाले टोकन की कॉपी करें। आपका सर्विस इसका उपयोग इसकी जांच के लिए करता है कि रिक्वेस्ट आपके सर्वर से आ रही हैं।

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समुदाय की ID और 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 के रूप में लिखा गया हो।
कस्टम कमांड चालू होने के लिए सर्वर का साइट URL सेट होना चाहिए: Antimatter इससे response_url बनाता है।

प्रतिक्रिया

JSON (Content-Type: application/json) के साथ 200 उत्तर दें:

{
  "response_type": "in_channel",
  "text": "Paris: 18 °C, light rain",
  "attachments": []
}
फील्डअर्थ
response_typeephemeral (डिफ़ॉल्ट): केवल वही व्यक्ति जोने कमांड चलाया, उसे उत्तर दिखता है, और रीलोड के बाद यह सहेजा नहीं जाता। in_channel: उत्तर चैनल में पोस्ट किया जाता है।
text, attachmentsसंदेश, वेबहुक की तरह: Markdown टेक्स्ट और attachments, बटन और मेन्यू सहित।
username, icon_urlदिखाने के लिए नाम और तस्वीर, यदि ओवरराइड्स की अनुमति है। कमांड की अपनी सेटिंग्स इन पर प्राथमिकता रखती हैं।
channel_idउत्तर किसी अन्य चैनल में पोस्ट करें, जिसका सदस्य वह व्यक्ति होना चाहिए।
goto_locationकमांड चलने के बाद खोलने के लिए एक URL।
props, typeवेबहुक की तरह अतिरिक्त गुण और कस्टम पोस्ट प्रकार।
extra_responsesअधिक उत्तर, प्रत्येक में वही फील्ड्स, पहले उत्तर के बाद पोस्ट किए जाते हैं।
skip_slack_parsingtrue टेक्स्ट को वैसा ही रखता है, 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) में इसे अनुमति देनी होगी।

विलंबित उत्तर

जिस कार्य के लिए टाइमआउट से अधिक समय लगता है, उसके लिए तुरंत उत्तर दें (उदाहरण के लिए एक अस्थायी "Working on it…"), फिर वास्तविक उत्तर को response_url पर POST करें। इसमें उत्तर के समान JSON जाता है, और यह कमांड के 30 मिनट के भीतर 5 बार तक काम करता है।

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 फ्लैग जोड़ते हैं। दोनों वेब इंटरफेस इन सुझावों को दिखाते हैं।

जब कोई व्यक्ति कोई कमांड टाइप करता है, Fusion कमांड और उसके प्रत्येक आर्गुमेंट को एक ब्लॉक के रूप में दिखाता है, जिसमें टाइप हो रहा आर्गुमेंट उसके हेल्प टेक्स्ट के साथ हाइलाइट किया जाता है। आर्गुमेंट AutocompleteData से आते हैं या, यदि वह उपलब्ध न हो, तो हिंट से: @[username]... #[channel] जैसे हिंट में, @ से शुरू होने वाले शब्द लोग आर्गुमेंट में जाते हैं और # से शुरू होने वाले शब्द चैनल आर्गुमेंट में, चाहे उनका क्रम कुछ भी हो; ... का अर्थ है कि आर्गुमेंट दोहराया जाता है, और अंतिम आर्गुमेंट बाकी टेक्स्ट लेता है।

आर्गुमेंट में चैनल

किसी कमांड के आर्गुमेंट में, @ लोगों का सुझाव देता है, # चैनल का सुझाव देता है और उन्हें #channel-name के रूप में पूरा करता है, और ~ उन्हें ~channel-name के रूप में पूरा करता है। Antimatter की वेब इंटरफ़ेस और मोबाइल ऐप चैनल लिंक # के साथ लिखती हैं, इसलिए कोई भी कमांड जो चैनल लेता है, दोनों रूपों को स्वीकार करना चाहिए: बिल्ट-इन /join, /mute और /invite ऐसा करते हैं, और उनके हिंट #[channel] कहते हैं।