REST API

Antimatter ایپس جو کچھ بھی کرتی ہیں، وہ سب اسی HTTP API کے ذریعے ہوتی ہیں، اس لیے آپ کے اسکرپٹس بھی یہی کر سکتے ہیں۔ یہ صفحہ وضاحت کرتا ہے کہ آپ کیسے تصدیق (authenticate) کریں، کون سے وسائل آپ سب سے زیادہ استعمال کریں گے، ریسپانس اور خرابیاں کیسے نظر آتی ہیں، اور WebSocket کے ذریعے ایونٹس کو براہِ راست کیسے فالو کریں۔

بنیادی باتیں

  • بنیادی URL: https://chat.example.com/api/v4۔ نیچے دیے گئے تمام اینڈ پوائنٹس اس کے حوالے سے ہیں۔
  • فارمیٹ: اندر اور باہر JSON، سوائے فائل اپ لوڈز (multipart) کے۔ Content-Type: application/json بھیجیں۔
  • آئی ڈیز: ہر آبجیکٹ کے پاس ایک 26 حروف پر مشتمل id ہوتا ہے۔ اوقات Unix epoch کے بعد کے ملی سیکنڈز میں ہوتے ہیں (create_at، update_at، delete_at؛ 0 کا مطلب ہے "حذف نہیں کیا گیا")۔
  • کمیونٹیز ٹیمز ہیں: API انہیں teams کہتا ہے، جن کے ساتھ team_id ہوتا ہے۔
  • آپ خود: جہاں بھی پاتھ user_id لیتا ہے، me کے مطلب ہیں سائنڈ ان صارف، جیسے GET /users/me۔

اینڈ پوائنٹس کی مکمل فہرست سرور کے کوڈ میں موجود ہے: روٹس server/channels/api4/*.go میں اعلان کیے گئے ہیں اور ٹائپس server/public/model میں ہیں۔ ریپوزٹری کے api/v4/source فولڈر میں موجود OpenAPI وضاحت Mattermost سے وراثت میں ملنے والے اِنڈ پوائنٹس اور Antimatter کے کچھ اضافوں (جیسے سلسلوں کو منتقل کرنا، ماڈل کنکشنز اور پیغامات کے اقدامات) کو کور کرتی ہے۔ باقی اِنڈ پوائنٹس صرف کوڈ میں موجود ہیں۔

تصدیق (Authentication)

ہر درخواست، سوائے سائن ان کرنے اور کچھ عوامی اینڈ پوائنٹس کے، Authorization ہیڈر میں ٹوکن کی ضرورت ہوتی ہے:

curl -H "Authorization: Bearer $TOKEN" https://chat.example.com/api/v4/users/me

وہاں تین قسم کے ٹوکنز قبول کیے جاتے ہیں: ذاتی رسائی ٹوکنز، سیشن ٹوکنز اور OAuth رسائی ٹوکنز۔ Authorization: Token … بھی قبول کیا جاتا ہے۔ کوئری سٹرنگ (?access_token=) میں ٹوکنز صرف OAuth رسائی ٹوکنز کے لیے قبول کیے جاتے ہیں۔

ذاتی رسائی ٹوکنز (اسکرپٹس کے لیے سفارش کردہ)

ذاتی رسائی ٹوکن آپ کی طرح کام کرتا ہے، جب تک آپ اسے ایک میعادِ ختم نہ دیں، اس کی میعاد ختم نہیں ہوتی، اور اسے کسی بھی وقت منسوخ کیا جا سکتا ہے۔ ذاتی رسائی ٹوکنز پہلے سے بند ہوتے ہیں:

  1. سسٹم ایڈمن سسٹم کنسول › انضمامات › انٹیگریشن مینجمنٹ میں پرسونل ایکسس ٹوکنز فعال کریں کو آن کرتا ہے (ServiceSettings.EnableUserAccessTokens، AM_SERVICESETTINGS_ENABLEUSERACCESSTOKENS)۔
  2. ہر اس شخص کے لیے جو ٹوکنز بنانے کا حق رکھتا ہے، سسٹم ایڈمن سسٹم کنسول › صارفین کا انتظام › صارفین کھولتا ہے، اس شخص کے مینیو میں کرداروں کا انتظام منتخب کرتا ہے اور اس اکاؤنٹ کو پرسونل ایکسس ٹوکنز بنانے کی اجازت دیں پر ٹک لگاتا ہے۔ سسٹم ایڈمنز ہمیشہ انہیں بنا سکتے ہیں۔
  3. شخص اپنا ایواٹار (avatar) اوپر دائیں جانب کھولتا ہے، پھر پروفائل اور ترتیبات › سیکیورٹی پر جاتا ہے۔ ذاتی رسائی ٹوکنز کے تحت، وہ ٹوکن کے مقصد کی وضاحت کرتا ہے اور ٹوکن بنائیں منتخب کرتا ہے۔ ٹوکن صرف ایک بار دکھایا جاتا ہے: اسے کاپی کریں۔

API کے ذریعے: POST /users/{user_id}/tokens کے ساتھ {"description": "backup script", "expires_at": 0} (expires_at ملی سیکنڈ میں؛ 0 کے لیے کوئی مدت نہیں)۔ جواب کے token فیلڈ میں راز (secret) ہوتا ہے؛ اس کا id وہ ہے جسے آپ اسے منسوخ کرنے کے لیے استعمال کرتے ہیں (POST /users/tokens/revoke کے ساتھ {"token_id": "…"})۔ کمانڈ لائن سے: amctl token generate <user> <description>۔

سسٹم ایڈمن اسی سسٹم کنسول پیج پر زیادہ سے زیادہ پرسونل ایکسس ٹوکن کی مدت (دن) کے ذریعے ٹوکنز کی مدت کو محدود کر سکتا ہے۔

سیشن ٹوکنز

پاس ورڈ کے ساتھ سائن ان کرنے پر Token ریسپانس ہیڈر میں ایک سیشن ٹوکن واپس آتا ہے، جو اسی قسم کا سیشن ہے جو ایپس استعمال کرتی ہیں:

curl -i -X POST https://chat.example.com/api/v4/users/login \
  -H 'Content-Type: application/json' \
  -d '{"login_id": "maya", "password": "…"}'

ملٹی فیکٹر اتھنٹیکیشن والا اکاؤنٹ کے لیے "token": "123456" شامل کریں۔ سیشنز سرور کے سیشن ترتیبات کے مطابق ختم ہوتے ہیں، اور لاگین انڈپوائنٹ ریٹ لیمٹڈ ہے (فی سیکنڈ 5 درخواستیں)۔ POST /users/logout سیشن کو ختم کرتا ہے۔

براؤزرز کوکیز کے ذریعے اتھنٹیکیشن کرتے ہیں۔ کوکیز کے ذریعے اتھنٹیکٹڈ درخواست کو GET کے علاوہ کسی بھی چیز کے لیے X-CSRF-Token ہیڈر بھی بھیجنا ہوگا؛ Authorization ہیڈر میں موجود ٹوکن کو CSRF ہیڈر کی ضرورت نہیں ہوتی۔

OAuth 2.0 ایپس

لوگوں کو اپنے Antimatter اکاؤنٹ کے ساتھ اپنی ایپلیکیشن میں سائن ان کرنے کی اجازت دینے کے لیے، ایک OAuth 2.0 ایپ رجسٹر کریں۔ Antimatter پھر OAuth پرووائڈر بن جاتا ہے:

  1. OAuth 2.0 سروس پرووائیڈر فعال کریں کو آن ہونا ضروری ہے (سسٹم کنسول › انضمامات › انٹیگریشن مینجمنٹ، ServiceSettings.EnableOAuthServiceProvider، جو پہلے سے آن ہے)۔
  2. جس شخص کے پاس OAuth ایپس کو منظم کرنے کا حق ہے (پہلے سے سسٹم ایڈمنز)، وہ اپنا ایواٹار کھولتا ہے، پھر انضمامات › OAuth 2.0 ایپس پر جاتا ہے، اور اپنی callback URLs کے ساتھ ایپ شامل کرتا ہے۔ اسے client ID اور client secret ملتا ہے۔
  3. آپ کی ایپ لوگوں کو https://chat.example.com/oauth/authorize پر بھیجتی ہے، جہاں response_type=code، client_id، redirect_uri اور state شامل ہوتے ہیں۔ code_challenge_method=S256 کے ساتھ PKCE کی حمایت کی جاتی ہے۔
  4. یہ کوڈ کو POST https://chat.example.com/oauth/access_token پر تبدیل کرتی ہے (پہلے grant_type=authorization_code، پھر تجدید کے لیے refresh_token)، اور API کو Authorization: Bearer <access token> کے ساتھ کال کرتی ہے۔

صارفین پروفائل اور ترتیبات › سیکیورٹی › آپ کی تصدیق شدہ ایپس میں وہ ایپس دیکھتے ہیں جنہیں انہوں نے تصدیق دی ہے۔

بنیادی وسائل

کیااینڈ پوائنٹس
آپ اور دیگر لوگGET /users/me، GET /users/{user_id}، GET /users/username/{username}، POST /users/ids (IDs کی فہرست)، POST /users/search، GET /users?in_team=…&in_channel=…
کمیونٹیزGET /users/me/teams, GET /teams/{team_id}, GET /teams/name/{name}, PUT /teams/{team_id}/patch, GET /teams/{team_id}/members, POST /teams/{team_id}/members
چینلزGET /users/me/teams/{team_id}/channels، GET /teams/name/{team}/channels/name/{channel}، POST /channels، POST /channels/direct (دو صارفین کے IDs)، POST /channels/group، POST /channels/{channel_id}/members
پیغامات (posts)POST /posts, GET /posts/{post_id}, PUT /posts/{post_id}/patch, DELETE /posts/{post_id}, GET /channels/{channel_id}/posts, GET /posts/{post_id}/thread, POST /teams/{team_id}/posts/search
ردعملPOST /reactions کے ساتھ {"user_id", "post_id", "emoji_name"}، DELETE /users/{user_id}/posts/{post_id}/reactions/{emoji_name}
فائلیںPOST /files (multipart: channel_id اور files)، پھر واپس آنے والے IDs کو پیغام کے file_ids میں ڈالیں؛ GET /files/{file_id}
ترجیحاتGET /users/me/preferences, PUT /users/me/preferences
انٹیکریشنز/hooks/incoming، /hooks/outgoing، /commands، /bots، /oauth/apps (اگلے صفحات دیکھیں)
سرورGET /system/ping (صحت، ٹوکن کی ضرورت نہیں)، GET /config/client?format=old (ترتیبات جو کلائنٹس دیکھتے ہیں)

پیغام بھیجیں

curl -X POST https://chat.example.com/api/v4/posts \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"channel_id": "'$CHANNEL_ID'", "message": "Backup finished: **42 GB** in 3 min"}'

پیغامات Markdown میں ہوتے ہیں۔ سلسلے میں جواب دینے کے لیے "root_id" (سلسلے کا پہلا پیغام) شامل کریں، فائلوں کے لیے "file_ids" اور منسلک فائلوں اور دیگر اضافی چیزوں کے لیے "props" (دیکھیں منسلک فائلیں)۔

چینل کا ID تلاش کریں

curl -H "Authorization: Bearer $TOKEN" \
  https://chat.example.com/api/v4/teams/name/lumen-labs/channels/name/ops-alerts

نام چینل کے لنک میں موجود ہیں: /lumen-labs/channels/ops-alerts۔

صفحات کی تقسیم

فہرست کے اِنڈ پوائنٹس page (0 سے) اور per_page (ڈیفالٹ 60، زیادہ سے زیادہ 200) لیتے ہیں۔ اگلے صفحے کے لیے پوچھتے رہیں جب تک کہ کوئی صفحہ per_page سے چھوٹا نہ آ جائے۔

کسی چینل کے پیغامات (GET /channels/{channel_id}/posts) بھی since (وقت: اس وقت کے بعد ہر تبدیلی) یا before اور after (پوسٹ ID) قبول کرتے ہیں۔ یہ ایک پوسٹ فہرست کے طور پر واپس آتے ہیں: {"order": [IDs, newest first], "posts": {ID: post}, "next_post_id", "prev_post_id"}۔

غلطیاں

غلطیاں عام HTTP اسٹیٹس کوڈز (400 غلط ان پٹ، 401 سائن ان نہیں کیا، 403 اجازت نہیں، 404 نہیں ملا، 501 فیچر بند) اور ایک JSON باڈی استعمال کرتی ہیں:

{
  "id": "api.context.permissions.app_error",
  "message": "You do not have the appropriate permissions.",
  "detailed_error": "",
  "request_id": "jz8zm5nunpbt8f3gpqsz5dq6so",
  "status_code": 403
}

اپنے کوڈ میں id استعمال کریں: message صارف کی زبان میں ترجمہ کیا جاتا ہے۔ detailed_error خالی رہتا ہے جب تک کہ سرور ڈویلپر موڈ (ServiceSettings.EnableDeveloper) میں چل رہا ہو۔ سرور کے ایڈمن کو request_id کا حوالہ دیں: یہ لاگز میں موجود ہے۔

ریٹ لمٹس

ریٹ لیمٹنگ پہلے سے بند ہے۔ جب سسٹم ایڈمن اسے آن کرتا ہے (سسٹم کنسول › ماحول › ریٹ لیمٹنگ)، تو پہلے سے ہر کلائنٹ کو 100 کے بارسٹس کے ساتھ فی سیکنڈ 10 درخواستیں ملتی ہیں، جو IP ایڈریس یا صارف کی بنیاد پر گنئی جاتی ہیں۔ جوابات میں X-RateLimit-Limit، X-RateLimit-Remaining اور X-RateLimit-Reset شامل ہوتے ہیں؛ حد سے اوپر، سرور 429 کے ساتھ Retry-After ہیڈر (سیکنڈز میں) جواب دیتا ہے۔ کچھ endpoints، جیسے سائن ان کرنا، ترتیب سے قطع نظر اپنی الگ حد رکھتے ہیں۔

اسکرپٹس لکھیں جو 429 پر انتظار کریں اور دوبارہ کوشش کریں، اور پولنگ سے بچیں: WebSocket کو فولو کریں۔

WebSocket ایونٹ اسٹریم

wss://chat.example.com/api/v4/websocket سے منسلک ہوں۔ تصدیق کے لیے یا تو کنکشن درخواست پر Authorization: Bearer ہیڈر استعمال کریں، یا اسے پہلا پیغام بھیجیں:

{"seq": 1, "action": "authentication_challenge", "data": {"token": "…"}}

سرور ایک hello ایونٹ بھیجتا ہے، پھر ہر چیز کے لیے ایک ایونٹ جو آپ دیکھنے کی اجازت رکھتے ہیں:

{
  "event": "posted",
  "data": {"channel_id": "…", "channel_type": "O", "post": "{\"id\":\"…\",\"message\":\"Hello\",…}"},
  "broadcast": {"channel_id": "…", "team_id": "", "user_id": "", "omit_users": null},
  "seq": 4
}

نوٹ کریں کہ data.post پوسٹ JSON اسٹرنگ کے طور پر ہے۔ عام ایونٹس: posted، post_edited، post_deleted، reaction_added، reaction_removed، typing، status_change، user_added، direct_added۔ ایپس اپنے اپنے ایونٹس بھیجتی ہیں، جن کے نام custom_<app id>_<event> ہوتے ہیں۔

آپ ایکشنز بھی بھیج سکتے ہیں، ہر ایک میں بڑھتا ہوا seq: user_typing کے ساتھ {"channel_id", "parent_id"}، یا get_statuses۔ جب کنکشن ٹوٹے تو دوبارہ منسلک ہوں، اور since کے ساتھ وہ چیزیں لائیں جو آپ نے چھوڑ دی (دیکھیں Pagination)۔

Antimatter ان ایونٹس کو شامل کرتا ہے: community_attributes_updated، member_timeouts_updated، post_put_on_top، post_removed_from_top، server_categories_updated، channel_overrides_updated اور category_overrides_updated۔

کلائنٹ لائبریریز

  • جائیں: server/public/model میں model.Client4 (import github.com/mattermost/mattermost/server/public/model)۔ model.NewAPIv4Client(url)، پھر client.SetToken(token)؛ model.NewWebSocketClient4(wsURL, token) events کو فالو کرتا ہے۔ Antimatter کی کاپی اپنے endpoints کے لیے طریقے شامل کرتی ہے، جیسے UpdateMessageRequest، PutPostOnTop اور ExportChannel۔
  • TypeScript: webapp/platform/client میں @mattermost/client کا Client4 کلاس، جس کے ٹائپس webapp/platform/types میں ہیں۔ Antimatter کے ریپوزٹری میں موجود کاپی Antimatter کے اندروپوائنٹس کو شامل کرتی ہے؛ Mattermost کے ذریعے npm پر شائع شدہ پیکج میں یہ شامل نہیں ہیں۔
package main

import (
	"context"
	"log"

	"github.com/mattermost/mattermost/server/public/model"
)

func main() {
	client := model.NewAPIv4Client("https://chat.example.com")
	client.SetToken("…")
	post, _, err := client.CreatePost(context.Background(), &model.Post{
		ChannelId: "…",
		Message:   "Hello from Go",
	})
	if err != nil {
		log.Fatal(err)
	}
	log.Println("posted", post.Id)
}

Antimatter API میں کیا شامل کرتا ہے

یہ اندروپوائنٹس اور فیلڈز Mattermost سرور پر موجود نہیں ہیں۔ ان سب کے لیے ایک سیشن درکار ہے۔

اندروپوائنٹیہ کیا کرتا ہے
GET /teams/{team_id}/user_attributes/fields
POST اسی راستے پر
PATCH، DELETE …/fields/{field_id}
کمیونٹی ایٹری بیٹس: پروفائل کے فیلڈز جو کمیونٹی کے ایڈمنز اپنے ارکان کے لیے تعریف کرتے ہیں (زیادہ سے زیادہ 20)۔ ارکان انہیں پڑھ سکتے ہیں؛ کمیونٹی ایڈمنز انہیں بناتے اور تبدیل کرتے ہیں۔
GET /teams/{team_id}/members/{user_id}/user_attributes
PATCH اسی راستے پر
POST /teams/{team_id}/user_attributes/values/search
کسی رکن کے ایٹری بیٹ ویلیوز، {field_id: value} کی شکل میں۔ ارکان اپنے خود کے ویلیوز سیٹ کرتے ہیں (ایڈمن کے زیرِ انتظام والوں کے سوا)؛ ایڈمنز کسی بھی رکن کے ویلیوز سیٹ کر سکتے ہیں۔ تلاش کے لیے {"user_ids": [...]} (زیادہ سے زیادہ 200) استعمال ہوتا ہے۔
GET /teams/{team_id}/timeouts
PUT /teams/{team_id}/members/{user_id}/timeout
GET /teams/{team_id}/members/{user_id}/moderation
ٹائم آؤٹس: {"until": time, "reason": "…"} کسی کو اس وقت تک کمیونٹی میں پوسٹ کرنے، ردعمل دینے اور اپ لوڈ کرنے سے روکتا ہے (زیادہ سے زیادہ 28 دن)؛ "until": 0 اسے ہٹا دیتا ہے۔ میڈریشن ویو میں یہ بتایا جاتا ہے کہ وہ کب شامل ہوئے اور حال ہی میں کتنی پوسٹس کی ہیں۔
GET /channels/{channel_id}/on_top
PUT, DELETE /posts/{post_id}/on_top
چینل کے اوپر رکھے گئے پیغامات (زیادہ سے زیادہ 10)۔ {"duration": ms}، زیادہ سے زیادہ 30 دن؛ 0 کا مطلب ہے کہ یہ ہٹائے جانے تک برقرار رہیں گے۔ چینل کو پڑھنے کی صلاحیت رکھنے والے انہیں فہرست میں دیکھ سکتے ہیں۔ کسی پیغام کو اوپر رکھنے یا ہٹانے کے لیے چینل میں پوسٹ کرنے کا حق ضروری ہے اور، کسی کمیونٹی کے چینل میں، چینل یا کمیونٹی کا ایڈمن ہونا، یا وہاں پیغامات کا انتظام (delete_others_posts) کا حق ہونا ضروری ہے۔ براہِ راست یا گروپ پیغام میں، اس کے ارکان یہ کر سکتے ہیں۔ آرکائیو شدہ چینلز میں یہ عمل مسترد کر دیا جاتا ہے۔
POST /channels/{channel_id}/message_requestآپ کے اپنے پیغام کے درخواست پر عمل کرتا ہے: {"action": "accept"}، "dismiss"، یا "request" تاکہ ایک گفتگو کو دوبارہ درخواستوں میں شامل کیا جا سکے۔ یہ آپ کے چینل ممبر کو واپس کرتا ہے۔
GET, PUT /channels/{channel_id}/overrides
GET /channels/{channel_id}/overrides/effective
GET, PUT /channels/{channel_id}/role_access
کسی چینل میں کسی کردار یا شخص کی کیا صلاحیتیں ہیں، اور کن کرداروں کو کردار سے بند شدہ چینل نظر آتا ہے۔
GET, PUT /teams/{team_id}/server_categories
GET, PUT …/server_categories/overrides
کمیونٹی کے مشترکہ چینل کیٹگریز، اور وہ اوور رائڈز جو کسی کیٹگری کے ہر چینل پر لاگو ہوتی ہیں۔
GET /groups/{group_id}/team_role
PUT …/team_role/permissions
وہ اجازتیں جو کمیونٹی کا کردار دیتا ہے۔
POST /teams/{team_id}/autolinks/previewکسی متن پر کمیونٹی کے آٹو لنکس کے قواعد آزمائے۔
POST /channels/{channel_id}/export?format=csv&since=&until=کسی چینل کے پیغامات کو CSV کے طور پر ڈاؤن لوڈ کریں (زیادہ سے زیادہ 50,000)، جو لوگ چینل پڑھ سکتے ہیں۔
GET /posts/{post_id}/speechپیغام جو ٹیکسٹ ٹو سپیچ ترتیب دینے پر آڈیو کے طور پر پڑھا جاتا ہے۔
POST /posts/{post_id}/move_to_channelکسی سلسلے کو اسی کمیونٹی کے دوسرے چینل میں منتقل کرتا ہے: دیکھیں سلسلہ منتقل کریں۔
GET, POST /ai/connections
GET, PATCH, DELETE /ai/connections/{connection_id}
GET /ai/connections/usable
ماڈل کنکشنز، جو AI پرووائڈرز ہیں جنہیں سرور کی AI خصوصیات اور ایپس استعمال کرتی ہیں: دیکھیں ماڈل کنکشنز۔
GET /channels/{channel_id}/message_actions
POST /posts/{post_id}/message_actions/{hook_id}
GET, POST /hooks/outgoing/{hook_id}/icon
پیغامات کے اقدامات: آؤٹ گوئنگ ویب ہکس جو لوگ پیغام کے مینیو سے چلاتے ہیں۔ دیکھیں پیغامات کے اقدامات۔

نئے فیلڈز

  • کمیونٹیز (Team، اور PUT /teams/{team_id}/patch): all_channels_membership (ہر شخص ہر چینل میں شامل ہے جسے وہ دیکھ سکتا ہے)، default_channel_id (جہاں نئے لوگ پہنچتے ہیں؛ خالی ہونے کا مطلب General ہے)، kind (community یا workplace: ورک پلیس میں، چینل ایڈمنز اپنے چینلز کو آرکائیو بھی کر سکتے ہیں؛ نئی کمیونٹیز کو سرور کا TeamSettings.DefaultCommunityKind ملتا ہے، جو طے شدہ طور پر community ہوتا ہے)، member_list_view (ارکان کی فہرست ارکان کو کیسے گروپ کرتی ہے: choice، جو طے شدہ ہے، ہر رکن کو انتخاب کی اجازت دیتا ہے؛ roles یا teams اسے طے کر دیتا ہے)، hide_role_colors، require_team_badges، onboarding اور autolinks (دونوں JSON سٹرنگز ہیں)۔
  • نئی کمیونٹی کا ڈیفالٹ چینل general (General) ہے، town-square نہیں۔ 0.9.0 اپ گریڈ ہر کمیونٹی کے town-square کو general میں تبدیل کر دیتا ہے، اس کی آئی ڈی برقرار رکھتے ہوئے، جب تک کہ کمیونٹی میں پہلے سے general چینل موجود نہ ہو۔ پرانے نام اب بھی کام کرتے ہیں: GET /teams/{team_id}/channels/name/town-square، GET /teams/name/{team}/channels/name/town-square اور آنے والے ویب ہک کا channel، جب کوئی چینل اس نام سے موجود نہ ہو، تو کمیونٹی کے ڈیفالٹ چینل کو فراہم کرتے ہیں۔ نئے کوڈ میں default_channel_id یا نام general استعمال کریں۔
  • چینل لنکس: #channel-name چینل کو لنک کرتا ہے، جیسا کہ ~channel-name کرتا ہے۔ پوسٹ کے channel_mentions پراپرٹی میں وہ چینلز درج ہیں جو کسی بھی طریقے سے لنک کیے گئے ہیں؛ کوئی #word جو کسی چینل کا نام نہ ہو، ہیش ٹیگ کے طور پر رہتا ہے۔ Antimatter کا ویب انٹرفیس اور موبائل ایپ #name لکھتی ہیں۔
  • آرکائیو شدہ چینلز اب بھی نئے اراکین قبول کرتے ہیں (POST /channels/{channel_id}/members)، جو ان کی تاریخ پڑھ سکتے ہیں۔ وہاں کوئی بھی پوسٹ نہیں کر سکتا، ردعمل نہیں دے سکتا، پن نہیں کر سکتا، پیغام کو اوپر نہیں لگا سکتا، چینل کا نام نہیں بدل سکتا یا اس کے اراکین کے کردار نہیں بدل سکتا۔
  • ان لائن جوابات: ایک پوسٹ جس میں "props": {"reply_to": "<post id>"} ہو، اسی چینل کے اس پیغام کو کوٹ کرتی ہے۔ اس کے مصنف کو مطلع نہ کرنے کے لیے "reply_to_mention": false شامل کریں۔ سرور metadata.reply_to میں کوٹ شدہ پیغام کا مختصر تعارف بھرتا ہے۔
  • اسپائلرز: "props": {"spoiler": true} پوسٹ کے متن اور فائلوں کو چھپا دیتا ہے جب تک قاری انہیں دیکھنے کا انتخاب نہ کر لے۔
  • نظرانداز کرنا اور بلاک کرنا ترجیحات ہیں: کیٹگری user_block، دوسرے شخص کے ID کے نام پر، جس کی قدر ignore یا block ہے۔ براہِ راست پیغام کی درخواست کے طور پر انتظار کرنے کا معاملہ آپ کے چینل کے رکن کے notify_props.dm_request میں ہے (pending، accepted یا dismissed)۔
  • پیغام کی منسلک فائل stages اور chart لے سکتی ہے: دیکھیں کارڈز۔

سلسلہ منتقل کریں

POST /posts/{post_id}/move_to_channel ایک سلسلے، اس کا پہلا پیغام اور اس کے تمام جوابات، کو اسی کمیونٹی کے کسی اور چینل میں منتقل کرتا ہے۔ post_id پہلا پیغام ہو سکتا ہے یا کوئی بھی جواب۔

curl -X POST https://chat.example.com/api/v4/posts/$POST_ID/move_to_channel \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"channel_id": "'$TARGET_CHANNEL_ID'", "flatten": false}'
  • channel_id (ضروری): وہ چینل جس میں سلسلہ منتقل ہوگا۔
  • flatten (ڈیفالٹ false): true ہونے پر جوابات سلسلے کے بجائے مقصد چینل کے پیغامات بن جاتے ہیں۔ Fusion کا Make it a channel اس کا استعمال کرتا ہے۔

پیغامات اپنے مصنفین، اوقات، ردعمل اور فائلوں کو برقرار رکھتے ہیں۔ ان کی کاپیاں silent_notification پراپرٹی کے ساتھ آتی ہیں، اس لیے وہ کسی کو اطلاع نہیں دیتیں۔ اصل پیغامات حذف کر دیے جاتے ہیں۔ جواب میں منتقل شدہ پہلا پیغام، اس کی نئی ID کے ساتھ، ملتا ہے۔

کون سلسلہ منتقل کر سکتا ہے

  • آپ کو سلسلہ پڑھنے اور مقصد چینل میں پوسٹ کرنے کی اجازت ہونی چاہیے۔
  • چینل کے ایڈمنز، کمیونٹی کے ایڈمنز، چینل میں پیغامات کا انتظام (delete_others_posts) کی صلاحیت رکھنے والے افراد، اور سسٹم ایڈمنز کوئی بھی سلسلہ منتقل کر سکتے ہیں۔
  • سلسلے کے مصنف کو اسے منتقل کرنے کی اجازت ہے جب دونوں چینلز عوامی ہوں، یا جب سلسلے کے تمام پیغامات اس کے ہوں۔ ورنہ جواب 403 ہوگا، ID api.post.move_thread.private_needs_moderator.app_error کے ساتھ۔
  • دونوں چینلز ایک ہی کمیونٹی میں ہونے چاہئیں (براہِ راست یا گروپ پیغامات نہیں)، مختلف ہونے چاہئیں، اور آرکائیو شدہ نہ ہوں۔ سسٹم پیغامات اور burn-on-read پیغامات کو منتقل نہیں کیا جا سکتا۔
  • اگر کسی سلسلے میں WranglerSettings.MoveThreadMaxCount پیغامات سے زیادہ پیغامات ہوں (ڈیفالٹ 100؛ بغیر حد کے 0)، تو منتقلی مسترد کر دی جائے گی۔

پوائنٹر اور نوٹ

منتقلی دو سسٹم پیغامات (ٹائپ system_wrangler) چھوڑتی ہے: پرانے چینل میں ایک پوائنٹر ("13 پیغامات والا سلسلہ #target میں منتقل کر دیا گیا") اور مقصد چینل میں ایک نوٹ ("یہ سلسلہ #source سے منتقل کیا گیا")، جو منتقل شدہ سلسلے کے نیچے یا، flatten کے ساتھ، اس کے پیغامات کے بعد آتا ہے۔ پیغام کے متن کے علاوہ، ان کے پروپس کلائنٹ کو چینل کے نام کو لنک کے طور پر دکھانے کی اجازت دیتے ہیں:

  • پوائنٹر: MovedThreadPermalink، NumMessages، MovedThreadChannelId، MovedThreadTeamName، MovedThreadPostId، اور عوامی مقصد کے لیے MovedThreadChannelName اور MovedThreadChannelDisplayName۔
  • نوٹ: MovedFromChannelId، MovedFromTeamName، MovedFromPostId (پوائنٹر)، MovedFromPermalink، اور عوامی ماخذ کے لیے MovedFromChannelName اور MovedFromChannelDisplayName۔

دونوں میں TranslationID بھی ہوتا ہے۔ ذاتی چینل کا نام چھوڑ دیا جاتا ہے: قارئین کو "کوئی اور چینل" نظر آتا ہے۔ Antimatter میں Mattermost کا اپنا POST /posts/{post_id}/move بند رہتا ہے؛ اس کے بجائے یہ انڈ پوائنٹ استعمال کریں۔

ماڈل کنکشنز

ماڈل کنکشن ایک AI پرووائیڈر کا پتہ اور کلید ہے، جسے ایڈمن سیٹ اپ کرتا ہے۔ سرور کی AI خصوصیات اور AI سروس کو کال کرنے والے ایپس ان کا استعمال کرتے ہیں۔ سسٹم ایڈمنز سرور-وائیڈ کنکشنز (manage_ai_connections) کو منظم کرتے ہیں؛ ایک کمیونٹی کے ایڈمنز اپنی کمیونٹی کے کنکشنز (manage_team_ai_connections) کو منظم کرتے ہیں۔ کلیدیں صرف لکھنے کے لیے ہیں: کوئی جواب انہیں شامل نہیں کرتا، صرف api_key_set اور api_key_last4۔

اندروپوائنٹیہ کیا کرتا ہے
GET /ai/connections?scope=وہ کنکشنز جو آپ منظم کرتے ہیں۔ scope server یا کسی کمیونٹی کا ID ہوتا ہے؛ اگر یہ نہ ہو، تو آپ کے زیرِ انتظام تمام اسکوپس۔
POST /ai/connectionsایک کنکشن شامل کرتا ہے (جواب 201)۔
POST /ai/connections/test, POST /ai/connections/modelsمحفوظ کرنے سے پہلے کنکشن کا ٹیسٹ کرتا ہے یا اس کے ماڈلز کی فہرست دیتا ہے۔ شامل کرنے جیسا ہی باڈی؛ کچھ محفوظ نہیں ہوتا۔
GET، PATCH (یا PUT)، DELETE /ai/connections/{connection_id}کنکشن پڑھتا، بدلتا یا حذف کرتا ہے۔ پچ میں صرف وہ فیلڈز ہوتی ہیں جو تبدیل کرنی ہیں؛ کلید برقرار رکھنے کے لیے api_key چھوڑ دیں۔
POST /ai/connections/{connection_id}/testمحفوظ شدہ کنکشن کا ٹیسٹ کرتا ہے: {"ok", "error", "status_code", "latency_ms", "model_count"}۔
GET /ai/connections/{connection_id}/modelsوہ ماڈلز جو پرووائڈر فراہم کرتا ہے۔
GET /ai/connections/{connection_id}/usageاس مہینے کی درخواستیں اور ٹوکنز۔
GET /ai/connections/usable?channel_id=&team_id=کسی بھی سائن این صارف کے لیے: وہ کنکشنز جو آپ وہاں استعمال کر سکتے ہیں، ان کے ماڈلز اور صلاحیتوں کے ساتھ، لیکن ان کے کی یا ایڈریسز کبھی نہیں۔

نئے کنکشن کا باڈی:

{
  "name": "Local models",
  "scope": "server",
  "provider": "openai_compatible",
  "base_url": "http://llm.internal:8000/v1",
  "api_key": "…",
  "extra_headers": {},
  "models": {"chat": "qwen3-32b", "embeddings": "", "transcription": "", "decisions": ""},
  "limits": {"requests_per_minute": 0, "monthly_token_budget": 0, "per_user_requests_per_minute": 0, "per_user_monthly_token_budget": 0},
  "sharing": {"all_teams": true, "team_ids": []},
  "audience": {"everyone": true, "group_ids": [], "roles": [], "allow_guests": false}
}

provider کے طور پر openai_compatible یا anthropic استعمال ہوتا ہے۔ scope کا ڈیفالٹ server ہے؛ کسی کمیونٹی کا آئی ڈی اسے اس کمیونٹی کا کنکشن بناتا ہے۔ limits میں 0 کا مطلب کوئی حد نہیں ہے؛ من فی درخواستیں ہر سرور پر گنی جاتی ہیں، جبکہ ٹوکنز کے بجٹ کلوسٹر کے لیے کلینڈر مہینے (UTC) کی بنیاد پر ہوتے ہیں۔ sharing بتاتا ہے کہ کون سی کمیونٹیز سرور وائیڈ کنکشن استعمال کر سکتی ہیں (براہِ راست اور گروپ پیغامات کے لیے all_teams درکار ہے)، اور audience بتاتا ہے کہ کون اسے استعمال کر سکتا ہے؛ مہمان صرف allow_guests کے ساتھ۔ تبدیلیاں آڈٹ لاگ میں لکھی جاتی ہیں۔ ایڈمن گائیڈ ترتیبات کی وضاحت کرتا ہے: دیکھیں AI۔