பாட்களை எழுதுதல் (பிளக்-இன்கள்)

பாட்கள் Antimatter-க்கு உள்ளிருந்து சேர்க்கைகளை சேர்க்கின்றன: சர்வருடன் இணைக்கப்படும் Go-இல் எழுதப்பட்ட சர்வர் பகுதி, மற்றும் மெனுக்கள், பேனல்கள், செய்தி வகைகள் மற்றும் பக்கங்களை சேர்க்கும் React-இல் எழுதப்பட்ட வெப் ஆப் பகுதி. இந்தப் பக்கம், Antimatter-இல் உள்ள Polls பாட்களை எடுத்துக்காட்டாகக் கொண்டு, ஒரு பாட்கள் எப்படி அமைக்கப்படுகிறது மற்றும் Antimatter-இன் Fusion இன்டர்ஃபேஸில் என்ன மாற்றங்கள் ஏற்படுகின்றன என்பதைக் காட்டுகிறது.

ஒரு பாட்கள் எப்படி செயல்படுகிறது

  • சர்வர் பகுதி ஒரு Go நிரல் ஆகும். சர்வர் இதை ஒரு தனித்த செயல்முறையாக இயக்கி, RPC மூலம் அதனுடன் தொடர்பு கொள்கிறது: அது பாட்களின் ஹூக்ஸ்களை அழைக்கிறது (ஒரு செய்தி பதிவு செய்யப்பட இருக்கிறது, ஒரு கட்டளை இயக்கப்பட்டது…), மற்றும் பாட்கள் சர்வரின் பிளக்-இன் API-யை அழைக்கின்றன (ஒரு பதிவை உருவாக்கு, ஒரு பயனரை படி, தரவுகளை சேமி…). இது /plugins/<app id>/ கீழ் HTTP வழிமுறைகளையும் வழங்க முடியும்.
  • வெப் ஆப் பகுதி வெப் ஆப் உடன் உலாவியில் ஏற்றப்படும் ஒரு JavaScript பண்டிள் ஆகும். இது ரெஜிஸ்ட்ரி-உடன் React கூறுகளை மற்றும் கால்ப்பேக்ஸ்களை பதிவு செய்கிறது: ஒரு மெனுவில் உள்ள பொத்தான், ஒரு பேனல், ஒரு செய்தி வகையை வரையுதல் போன்றவை.
  • இரு பகுதிகளும் விருப்பத்திற்குரியவை. ஒரு பாட்கள் .tar.gz பண்டிளாக நிறுவப்படுகிறது, மேலும் அமைப்பு நிர்வாகிகள் அதை இயக்குவார்கள், முடக்குவார்கள் அல்லது அமைப்பார்கள்.
சர்வர் பகுதி சர்வரின் தரவுகளுக்கு முழு அணுகலுடன் இயங்குகிறது. ஒரு பாட்களை சர்வருக்கு நீங்கள் பரவல் செய்கிற நிரல் போலக் கருதுங்கள்.

Antimatter, Mattermost-க்காக எழுதப்பட்ட பாட்களை இயக்குகிறது, மற்றும் அதேபோல Mattermost, Antimatter-க்காக எழுதப்பட்ட பாட்களை இயக்குகிறது, ஆனால் ஒரு பாட்கள் இருவரிடமிருந்தும் உள்ள ஹூக்ஸ்களை மட்டுமே பயன்படுத்தினால். Antimatter-க்கு மட்டுமே உள்ள ஹூக்ஸ் காண்க.

பண்டிள் அமைப்பு

தனித்த தொடக்கக் கட்டளைகள் இல்லை: antimatter-plugin-polls அல்லது antimatter-plugin-todo போன்ற சிறிய பண்டிள் செய்யப்பட்ட பாட்களில் இருந்து தொடங்கி, அதன் ID மற்றும் நிரலை மாற்றுங்கள். Polls இதுபோல் அமைக்கப்பட்டுள்ளது:

antimatter-plugin-polls/
├── plugin.json            the manifest
├── Makefile               build, test, bundle, deploy
├── build/                 the manifest and pluginctl helper tools (Go), setup.mk
├── assets/icon.svg        files shipped with the bundle
├── go.mod
├── server/
│   ├── main.go            plugin.ClientMain(&Plugin{})
│   ├── plugin.go          the Plugin type, OnActivate, ServeHTTP
│   ├── manifest.go        generated from plugin.json
│   ├── api.go, command.go, hooks.go, store.go …
│   └── dist/              compiled binaries, one per platform
└── webapp/
    ├── package.json, webpack.config.js, tsconfig.json
    ├── i18n/              en.json and one file per language
    ├── src/index.tsx      registers the app with the web app
    ├── src/manifest.ts    generated from plugin.json
    ├── src/translations.ts
    └── dist/main.js       the bundle

விருப்பத்திற்குரியது: public/ கோப்புறை, /plugins/<app id>/public/ இல் அப்படியே வழங்கப்படுகிறது.

plugin.json

{
  "id": "com.example.weather",
  "name": "Weather",
  "description": "Forecasts in the chat.",
  "homepage_url": "https://github.com/example/weather",
  "support_url": "https://github.com/example/weather/issues",
  "icon_path": "assets/icon.svg",
  "version": "1.0.0",
  "min_server_version": "12.0.0",
  "server": {
    "executables": {
      "linux-amd64": "server/dist/plugin-linux-amd64",
      "linux-arm64": "server/dist/plugin-linux-arm64",
      "darwin-amd64": "server/dist/plugin-darwin-amd64",
      "darwin-arm64": "server/dist/plugin-darwin-arm64",
      "windows-amd64": "server/dist/plugin-windows-amd64.exe"
    }
  },
  "webapp": {"bundle_path": "webapp/dist/main.js"},
  "settings_schema": {"settings": []}
}
  • id: தனித்துவமானது மற்றும் நிலையானது; ஒரு தலைகீழ் டொமைன் பெயல் வழக்கமானது. இது வழிமுறைகளுக்கு, சேமிக்கப்பட்ட அமைப்புகளுக்கு மற்றும் WebSocket நிகழ்வுகளுக்கு பெயரிடப்படுகிறது.
  • version: செமான்டிக் வெர்ஷன். பண்டிள் செய்யப்பட்ட பாட்கள் இதை plugin.json-இல் விடுபடுத்துகின்றன; அவற்றின் கட்டமைப்பு கருவி இதை கடைசி v* git டேக்-இல் இருந்து எடுக்கிறது.
  • min_server_version: Antimatter 12.0.0 என அறிவிக்கிறது.
  • settings_schema: அமையப்பு கனசோலில் (System Console) உள்ள செயலியின் அமைப்புகள் பக்கம் (காண்க அமைப்புகள்).

make apply மானிபெஸ்டை (manifest) server/manifest.go மற்றும் webapp/src/manifest.ts கோப்புகளில் நகலெடுக்கிறது; make manifest-check அதை சரிபார்த்து உறுதிப்படுத்துகிறது.

சர்வர் பகுதி

சர்வர் பகுதி, Mattermost செயலிகளின் Go மோடியுலான github.com/mattermost/mattermost/server/public-ஐ Go மோடியுலு புராக்ஸியிலிருந்து இறக்குமதி செய்கிறது. அதன் main செயலியை மட்டுமே இயக்குகிறது:

package main

import "github.com/mattermost/mattermost/server/public/plugin"

func main() {
	plugin.ClientMain(&Plugin{})
}

Plugin வகை, plugin.MattermostPlugin-ஐ உள்ளடக்கியது; இதனால் p.API கிடைக்கிறது. தேவையான ஹூக்ஸ்களை (hooks) இது செயல்படுத்துகிறது:

type Plugin struct {
	plugin.MattermostPlugin
	router *mux.Router
}

func (p *Plugin) OnActivate() error {
	p.router = p.newRouter()
	return p.API.RegisterCommand(&model.Command{
		Trigger:          "weather",
		AutoComplete:     true,
		AutoCompleteDesc: "Show the forecast",
		AutoCompleteHint: "[city]",
	})
}

func (p *Plugin) ExecuteCommand(c *plugin.Context, args *model.CommandArgs) (*model.CommandResponse, *model.AppError) {
	city := strings.TrimSpace(strings.TrimPrefix(args.Command, "/weather"))
	return &model.CommandResponse{
		ResponseType: model.CommandResponseTypeEphemeral,
		Text:         "Forecast for " + city + ": sunny",
	}, nil
}

func (p *Plugin) ServeHTTP(c *plugin.Context, w http.ResponseWriter, r *http.Request) {
	p.router.ServeHTTP(w, r)
}

பொதுவான ஹூக்ஸ்கள்

ஹூக்எப்போது இயங்குகிறது
OnActivate, OnDeactivateசெயலி இயக்கப்பட்டாலும் அல்லது நிறுத்தப்பட்டாலும், மேலும் சர்வர் இயங்கும்போதும் நிறுத்தப்படும்போதும். OnActivate-ல் கட்டளைகள் மற்றும் பாட்களை பதிவு செய்யவும்.
OnConfigurationChangeஅதன் அமைப்புகள் மாறும்போது; p.API.LoadPluginConfiguration(&cfg) மூலம் அவற்றை ஏற்றவும்.
ServeHTTP/plugins/<app id>/… ஐ நோக்கிய கோரிக்கைகள். கோரிக்கை உள்நுழைந்த பயனரிடமிருந்து வந்தால், சர்வர் Mattermost-User-Id தலைப்பை (header) அமைக்கும்; பொதுவாக இல்லாமல் இருக்க வேண்டிய கோரிக்கைகள் தவிர, இல்லாத கோரிக்கைகளை நிராகரிக்கவும்.
ExecuteCommandசெயலி பதிவு செய்த ஒரு கட்டளை இயக்கப்பட்டது.
MessageWillBePosted, MessageWillBeUpdatedசெய்தி சேமிக்கப்படும் முன்: மாற்றப்பட்ட பதிவை (post) திருப்பி அனுப்பவும், அல்லது அதை நிராகரிக்கும் காரணத்தை தரவும்.
MessageHasBeenPosted, MessageHasBeenUpdated, MessageHasBeenDeletedபின்னணி விளைவுகளுக்காக, நிகழ்வுக்குப் பிறகு.
ReactionHasBeenAdded, ReactionHasBeenRemovedவினைகள் (Reactions).
UserHasJoinedChannel, UserHasLeftChannel, UserHasJoinedTeam, UserHasLeftTeam, ChannelHasBeenCreatedஉறுப்பினர் மற்றும் சேனல் மாற்றங்கள். ஒரு குழு என்பது ஒரு சமூகம்.
FileWillBeUploadedகோப்பு சேமிக்கப்படும் முன்: அதை மாற்றவும் அல்லது நிராகரிக்கவும்.
OnPluginClusterEventகிளஸ்டரின் மற்றொரு சர்வரில் உள்ள அதே செயலியிலிருந்து வரும் செய்தி.

சரியான சின்னேச்சர்களுடன் (signatures) கூடிய முழு பட்டியலும் server/public/plugin/hooks.go-ல் உள்ளது; API server/public/plugin/api.go-ல் உள்ளது. pluginapi தொகுப்பு (server/public/pluginapi) API-ஐ நண்புதரமான உதவித்தொகுப்புகளில் (helpers) சுருக்கமாக வழங்குகிறது.

பயனுள்ள API அழைப்புகள்

  • CreatePost, UpdatePost, SendEphemeralPost: செயலியின் பாடாகவோ அல்லது பயனராகவோ பதிவு செய்ய.
  • EnsureBotUser(&model.Bot{Username, DisplayName}): செயலியின் பாட்களை ஒருமுறை உருவாக்கி அதன் ID-ஐ பெற.
  • PublishWebSocketEvent("poll_updated", payload, &model.WebsocketBroadcast{ChannelId: id}): வலை செயலிக்கு நிகழ்வை அனுப்ப. அது custom_<app id>_poll_updated என வரும்.
  • OpenInteractiveDialog: ஒரு உரையாடல் பெட்டியை (dialog) திறக்க.
  • LogInfo, LogError மற்றும் தொடர்புடையவை: செயலியின் ID-உடன் குறிக்கப்பட்டு சர்வர் பதிவுக்கு (log) எழுத.
  • GetUser, GetChannel, HasPermissionToChannel: பயனருக்காக செயல்படும் முன், யார் என்ன செய்ய அங்கீகரிக்கப்பட்டுள்ளனர் என்பதை சரிபார்க்க.

ஒரு செயலி (app) கிளஸ்டரின் ஒவ்வொரு சர்வரிலும் இயங்குகிறது. நிலையை (state) மெமரி மட்டும் அல்ல, key-value store அல்லது database-ல் வைக்கவும்.

AI சேவை

Antimatter சர்வர் செயலிகளுக்காக AI மாதிரிகளை அழைக்கிறது; இது நிர்வாகியால் அமைக்கப்பட்ட மாதிரி இணைப்புகள் மூலம் நடைபெறுகிறது (நிர்வாக வழிகாட்டியில் AI பகுதியைப் பார்க்கவும்). ஒரு செயலி எந்தவொரு வழங்குநரின் விசையையும் (key) வைத்திருக்காது: அது யாருக்காக, எங்கே செயல்படுகிறது என்பதைக் குறிப்பிடுகிறது. சர்வர் அந்த நபர் அந்த இடத்தில் அந்த இணைப்பைப் பயன்படுத்த அனுமதிக்கப்படுகிறாரா என்பதைச் சரிபார்த்து, அதன் எல்லைகளையும் பட்ஜெட்டுகளையும் (budgets) விதிக்கிறது, டோக்கன்களை (tokens) அந்த நபருக்கும் செயலிக்கும் எதிராக எண்ணிக்கை செய்கிறது, மற்றும் உள்ளடக்கம் இல்லாமல் அந்த அழைப்பை ஆடிட் (audit) செய்கிறது.

மெதாட்இது என்ன செய்கிறது
AIChat(actingUserID, channelID, teamID, *ai.ChatRequest)ஒரு சாட் நிறைவு (chat completion): செய்திகள், கருவிகள், கட்டமைக்கப்பட்ட வெளியீடு (JSONSchema).
AIChatStream(…)அதே, ஸ்ட்ரீம் செய்யப்பட்டது: சேனல் மூடப்படும் வரை ஸ்ட்ரீமின் Events ஐப் படிக்கவும், அல்லது அழைப்பை நிறுத்த Close செய்யவும்.
AIEmbed(…, *ai.EmbedRequest)உரைகளின் எம்பெட்டிங்ஸ் (embeddings).
AITranscribe(…, *ai.TranscribeRequest)குரல் முதல் உரை வரை (Speech to text).
AIDecide(…, *ai.DecideRequest)ஒரு உரை பற்றிய முடிவு மாதிரிக்கு (yes or no, a choice, a score) வகைப்படுத்தப்பட்ட கேள்விகள்.
AIConnectionsForUser(userID, channelID, teamID)அங்கு ஒரு நபர் பயன்படுத்தக்கூடிய இணைப்புகள், அவற்றின் மாதிரிகள் மற்றும் திறன்களுடன்; அவற்றின் விசைகள் (keys) எப்போதும் இல்லை.

ஒவ்வொரு கோரிக்கையின் ConnectionID இணைப்பைத் தேர்ந்தெடுக்கிறது, Model அதன் மாதிரிகளில் ஒன்றைத் தேர்ந்தெடுக்கிறது (இணைப்பின் இயல்புநிலைக்கு காலியாக). Operation பயன்பாட்டு மற்றும் ஆடிட் பதிவுகளுக்கான ஒரு குறுகிய லேபிள், எப்போதும் உள்ளடக்கம் அல்ல. அவற்றின் குறைந்தபட்ச சர்வர் பதிப்பு 11.11.

actingUserID ஐ சர்வர் சரிபார்த்த மூலத்திலிருந்து மட்டுமே எடுக்கவும்: உங்கள் ServeHTTP ஐ நோக்கிய கோரிக்கையின் Mattermost-User-Id ஹெடர், அல்லது ஹூக்கின் பின்னணியில் உள்ள பயனர் (ஒரு பதிவின் ஆசிரியர், ஒரு கட்டளையை இயக்கிய பயனர்). ஒரு செய்தியிலிருந்து, வெப்கூக் (webhook) லோட்பேல்ட்டிலிருந்து, URL இலிருந்து அல்லது மற்றொரு செயலியின் கோரிக்கையிலிருந்து எடுக்க வேண்டாம்: உங்கள் செயலி மற்றொருவரின் அணுகலை (access) செலவழிக்கும்.

இந்த முறைகள் மற்றும் ai தொகுப்பு (server/public/ai) Mattermost வெளியிட்ட பதிப்பில் இல்லை; Antimatter இன் தொகுப்பின் நகலில் மட்டுமே உள்ளன. அவற்றைப் பயன்படுத்த, உங்கள் go.mod இல் ஒரு replace வரி மூலம் Antimatter இன் server/public எதிராக build செய்யவும், எடுத்துக்காட்டாக replace github.com/mattermost/mattermost/server/public => ../antimatter/server/public. இத்தகைய செயலி Antimatter இல் மட்டுமே இயங்கும்.

தரவு சேமிப்பு

ஒவ்வொரு செயலிக்கும் சர்வரின் database-ல் தனி key-value store உண்டு:

  • KVSet(key, value), KVGet(key), KVDelete(key): மதிப்புகள் (values) bytes ஆக இருக்கும், பொதுவாக JSON. விசைகள் (keys) அதிகபட்சம் 150 எழுத்துகள்.
  • KVSetWithExpiry(key, value, seconds): அந்த நேரம் முடிந்த பிறகு மதிப்பு அழிக்கப்படும்.
  • KVCompareAndSet(key, old, new) மற்றும் Atomic உடன் KVSetWithOptions: பல கோரிக்கைகள் அல்லது சர்வர்கள் ஒரே key-ஐ எழுதும்போது பாதுகாப்பான புதுப்பிப்புகள். Polls இந்த முறையில்தான் ஒவ்வொரு வாக்கையும் சேமிக்கிறது, மோதல் ஏற்பட்டால் மீண்டும் முயற்சிக்கிறது.
  • KVList(page, perPage): விசைகள், பக்கம் பக்கமாக.

வெப் செயலி பகுதி

பண்டிள் (bundle) window.registerPlugin மூலம் ஒரு வகுப்பை (class) பதிவு செய்கிறது. அதன் initialize registry மற்றும் Redux store-ஐ பெறுகிறது:

import manifest from './manifest';

class Plugin {
    initialize(registry, store) {
        registry.registerTranslations((locale) => translationsFor(locale));
        registry.registerPostTypeComponent('custom_poll', PollPost);
        registry.registerWebSocketEventHandler(`custom_${manifest.id}_poll_updated`, (msg) => {
            store.dispatch(pollUpdated(JSON.parse(msg.data.poll)));
        });
        registry.registerReconnectHandler(() => store.dispatch(reloadPolls()));
    }
}

window.registerPlugin(manifest.id, new Plugin());
  • பகிர்ந்த நூலகங்கள். வெப் செயலி React, ReactDOM, Redux, React Redux மற்றும் React Intl-ஐ வழங்குகிறது: உங்கள் சொந்த நகல்களை பண்டிள் செய்யாமல், அவற்றை webpack externals (React, ReactDOM, Redux, ReactRedux, ReactIntl) ஆக பட்டியலிடுங்கள். Polls-இன் webpack.config.js-ஐ பாருங்கள்.
  • உங்கள் சர்வர் பகுதியை அழைத்தல். Client4.getOptions() ( mattermost-redux/client இலிருந்து) இல் உள்ள விருப்பங்களுடன் ${window.basename}/plugins/<app id>/… ஐ Fetch செய்யவும்: அவை சர்வருக்கு உலாவியிலிருந்து கோரிக்கையை ஏற்க தேவையான தலைப்புகளை (headers) கொண்டுள்ளன.
  • உங்கள் சொந்த நிலை. registerReducer ஒரு reducer-ஐ சேர்க்கிறது, அது state['plugins-<app id>'] கீழ் சேமிக்கப்படுகிறது.
  • வகைகள் (Types). Antimatter-இன் கூடுதல் registry முறைகள் Mattermost-இன் வெளியிடப்பட்ட வகைகளில் இல்லை: Polls அது பயன்படுத்தும் registry-ஐ webapp/src/types/host.ts இல் விவரிக்கிறது.

Registry-இன் முறைகள் மற்றும் அவற்றின் அளவுருக்கள் (parameters) குறியீட்டில் ஆவணப்படுத்தப்பட்டுள்ளன, webapp/fusion/src/plugins/registry.ts (Fusion) மற்றும் webapp/channels/src/plugins/registry.ts (classic) இல்.

Fusion இடைமுகத்தை ஆதரித்தல்

Antimatter-இல் இரண்டு வெப் இடைமுகங்கள் உண்டு: Fusion (இயல்புநிலை) மற்றும் classic. இரண்டும் ஒரே செயலி பண்டிள்களை ஏற்றுகின்றன, ஒரே registry-ஐ கொண்டுள்ளன, ஆனால் Fusion பல விஷயங்களை தானே வரைகிறது, செயலி கூறுகளை (components) தனியாக வைக்கிறது. உங்கள் செயலியை இரண்டிலும் சோதிக்கவும்.

இடைமுகத்தை கண்டறிதல்

எந்த செயலியும் ஏற்றப்படும் முன், இரண்டு இடைமுகங்களும் window.antimatterWebUI ஐ 'fusion' அல்லது 'classic' ஆக அமைக்கின்றன, மேலும் பக்கத்தின் root element-ல் data-am-web-ui ஆக அதே மதிப்பை வைக்கின்றன. Mattermost-இல், இரண்டும் அமைக்கப்படாது.

export function isFusionUI(): boolean {
    return window.antimatterWebUI === 'fusion' || document.documentElement.dataset.amWebUi === 'fusion';
}

இணைக்கப்பட்ட ஆப்கள் (bundled apps) வெவ்வேறு விதமாக வரையப்பட இந்த அம்சத்தைப் பயன்படுத்துகின்றன. Polls ஆப், Fusion-இன் பாணியில் தனது கர்துகள் (poll cards) மற்றும் உருவாக்க விண்டோவை வரைகிறது, மேலும் Fusion-இல் /poll ல் தனது சொந்த விண்டோவைத் திறக்கிறது. அழைப்புகள் (Calls) மற்றும் குரல் சேனல்கள் (Voice channels), Fusion தனது சொந்த அழைப்பு இடைமுகத்துடன் மாற்றிவிடும் பக்தவாட்டபு (sidebar) மற்றும் டோஸ்ட் (toast) கூறுகளை விட்டுவிடுகின்றன. Agents ஆப், hover toolbar-இன் பதிலாக, மேலும் செயல்கள் என்ற குழுவின் கீழ் தனது AI செயல்களைச் செய்தி மெனுவில் வைக்கிறது. Fusion-இன் சொந்த CSS வகுப்புகள் (am- முன்னொட்டுடன்) மற்றும் அதன் விண்டோ அடுக்கு (am-layer உருப்படி) ஆகியவை இந்த ஆப்கள் இடைமுகத்தைப் பொருந்தச் செய்யப் பயன்படுத்துகின்றன; இவை ஆவணப்படுத்தப்பட்ட, நிலையான API அல்ல.

Fusion-இல் பிளகின் கூறுகள் (plugin components) எங்கே தோன்றும்

பதிவு முறை (Registry method)Fusion-இல் அது எங்கே தோன்றும்
registerAppBarComponent, registerChannelHeaderButtonActionவலது விளிம்பில், உங்கள் அவதாரத்திற்கும் Antimatter பற்றி பொத்தானுக்கும் இடையே உள்ள ஐகான்களின் நெடுவரிசை. சேனல் தலைப்பு பொத்தான்களும் அங்கேயே இருக்கும், சேனல் தலைப்பில் இல்லை. அமைப்பு நிர்வாகி ஆப்ஸ் பாரை அணை (ExperimentalSettings.DisableAppBar, இயல்பாக அணைக்கப்பட்டது) ஐ இயக்கினால் மறைக்கப்படும்.
registerRightHandSidebarComponentவலது பக்கப் பலகை (right-hand panel). அதன் விளிம்பை இழுத்து மக்கள் அதை மாற்றியமைக்கலாம், புதிய விண்டோவில் திறக்கலாம். ஆப் ஒரு பொருட்பட்டால் (product), பலகை மழு பக்தமாக திறக்கவமும் விருப்பத்தை வழங்கும். புதிய விண்டோவில் உள்ள பலகை ஐப் பார்க்கவும்.
registerChannelHeaderIconஅழைப்பு பொத்தான்களுக்குப் பின் சேனல் தலைப்பில் உள்ள ஐகான்கள்; தொலைபேசிகளில், தலைப்பின் மேலும் மெனுவில்.
registerCallButtonActionசேனல் தலைப்பின் அழைப்பு பொத்தான்; பல வழங்குநர்கள் அழைக்கிறதின் மற்த் வழிகள்த் மெனுவைப் பகிர்ந்து கொள்கின்றனர்.
registerPostDropdownMenuActionசெய்தியின் செய்தி செயல்கள் (⋯) மெனுவில், அதன் மேலும் செயல்கள் துணை மெனுவில்; த்ரெட் பலகையின் த்ரெட் செயல்கள் மெனுவிலும், மேலும் செயல்கள் கீழே. Fusion ஒவ்வொரு செயலின் முன்னும் ஆப்பின் ஐகானை, பச்சை நிறத்தில் வரைகிறது: இணைக்கப்பட்ட ஆப்களுக்கு அதன் சொந்த ஐகான், இல்லையெனில் ஆப் ரெயில் (app rail) இல் காட்டும் ஐகான், இல்லையெனில் ஒரு நடுநெறி ஐகான். செயலின் உரையின் தொடக்கத்தில் உரை இல்லாத ஒரு உருப்படி (ஆப் தானாக வரையும் ஐகான்) மறைக்கப்படும்.
registerPostDropdownSubMenuActionஒற்றை செயல்களுக்குப் பிறகு, அதே மேலும் செயல்கள் துணை மெனுவில் ஒரு தலைப்புடன் கூடிய குழு. செய்தி மெனுவில் ஆப்பிற்கு தனித்தனி உள்வருதல் (entry) இல்லை.
registerPostActionComponentசெய்தியின் ஹோவர் டூல்பாரில் (message hover toolbar), ⋯ பொத்தானுக்கு முன்.
registerPostTypeComponent, registerPostMessageAttachmentComponent, registerPostHeaderComponent, registerPostWillRenderEmbedComponentசெய்தியின் உடல் (body): அதன் உரைக்குக் கீழே, அதன் நேரத்திற்குப் பின், மற்றும் இணைப்பு முன்னோட்டங்களின் (link previews) இடத்தில்.
registerChannelHeaderMenuActionசேனலின் சேனல் விருப்பங்கள் (Channel options) மெனுவில் (பக்கவாட்டுப் பட்டையின் சேனலில் ⋯ அல்லது வலது-கிளிக்), பிளக் ஐகானுடன் கூடிய உருப்படிகளாக.
registerMainMenuActionசமூக மெனுவில் (சேனல் பட்டியலின் மேலே உள்ள சமூகத்தின் பெயர்), மேலும் செயல்கள் கீழே, செயல்களால் தொகுக்கப்பட்ட நிலையில்.
registerSidebarBrowseOrAddChannelMenuActionசேனல் உருவாக்கு மற்றும் வகையை உருவாக்கு க்குப் பிறகு உள்ள சமூக மெனு.
registerFileUploadMethodஉருவாக்குநரின் (composer) + மெனு (செய்தியில் சேர்), கோப்பை பதிவேற்றவும் க்குப் பிறகு.
registerPostEditorActionComponentஎழுதுபொறி இன் வடிவமைப்புப் பட்டில் (formatting bar), வடிவமைப்பு காட்டப்படும்போது.
registerAIActionMenuItemComponentஎழுதுபொறி இன் AI மெனுவில்.
registerFileDropdownMenuAction, registerFilePreviewComponentகோப்பின் விருப்ப மெனுவில், மற்றும் கோப்பு முன்னோட்டத்தில் (file preview).
registerUserSettingsசுயவிவரம் & அமைப்புகள், பிளக்-இன்கள் தலைப்பின் கீழ் ஒவ்வொரு ஆப்பிற்கும் ஒரு தாவல் (tab).
registerChannelSettingsTabசேனல் அமைப்புகள் விண்டோ, ஆப்கள் தலைப்பின் கீழே.
registerPopoverUserAttributesComponent, registerPopoverUserActionsComponentபெயரை அல்லது அவதாரத்தைக் கிளிக் செய்யும்போது தோன்றும் சுயவிவரம் அட்டை (profile card).
registerLeftSidebarHeaderComponent, registerSidebarChannelLinkLabelComponent, registerChannelIconOverride, registerBottomTeamSidebarComponentகம்யூனிட்டியின் சேனல் பட்டியலின் மேல் பகுதி, ஒரு சேனலின் பெயருக்கு அருகில், சேனலின் ஐகானுக்கு அருகில், மற்றும் இடதுபுறத்தில் உள்ள கம்யூனிட்டி ரெயிலின் கீழ் பகுதி.
registerChannelIntro, registerChannelIntroButtonAction, registerChannelToastComponent, registerNewMessagesSeparatorActionComponent, registerChannelComposerBannerComponent, registerComposerPlaceholderஒரு சேனலின் வரலாற்றின் தொடக்கம், செய்தி பட்டியலின் மேல் பகுதி, படிக்கப்படாத கோடு, கம்போசரின் மேல், மற்றும் கம்போசரின் பிளேஸ்ஹோல்டர்.
registerChannelTypeOptionசேனல் உருவாக்கு டயலாக்கின் சேனல் வகைகள்.
registerSearchComponentsசேனல் ஹெடரின் தேடல் பெட்டி: அது காலியாக இருக்கும்போது ஆப் ஸ்கோப்கள் தோன்றும்.
registerUserGuideDropdownMenuActionAntimatter பற்றி (ஆப் ரெயிலின் கீழ் பகுதி), உதவி கீழ்.
registerProductபொருட்பட்ட URL-இல் முழு பக்கங்கள், Antimatter பற்றி இல் பொருட்கள் கீழே பட்டியலிடப்பட்டுள்ளன. பொருள் பக்கங்கள் கிளாசிக் பக்கக் கட்டமைப்பை (page frame) வைத்திருக்கின்றன, அதன் பொருள் மெனு ஒரு ஆப் பொருளைப் பதிவு செய்தால் அல்லது அதில் ஒரு உள்வருதலைச் சேர்த்தால் மட்டுமே தோன்றும். இணைக்கப்பட்ட Kanban மற்றும் Playbooks ஆப்கள் இனி பொருட்களைப் பதிவு செய்யவில்லை: அவற்றின் பக்கங்கள் அவற்றின் பக்கப் பலகைகளில் (side panels) திறக்கின்றன.
registerRootComponent, registerGlobalComponent, registerMessageWillBePostedHook, registerSlashCommandWillBePostedHook, registerMessageWillFormatHook, registerFilesWillUploadHook, registerDesktopNotificationHook, registerWebSocketEventHandler, registerReducer, registerTranslations போன்ற ஹூக்க்கள்கிளாசிக் இன்டர்ஃபேஸில் செயல்படும்படி.
registerAdminConsolePlugin, registerAdminConsoleCustomSettingஅமைப்பு கன்சோல், இது இரண்டு இன்டர்ஃபேஸ்களிலும் கிளாசிக் ஒன்றாகும்.

Fusion காட்டாதது அல்லது இயக்காதது

  • registerPostDropdownMenuComponent (செய்தி மெனுவில் உள்ள ஒரு கூறு), registerPostCardTypeComponent (வலதுபுறப் பலகையில் உள்ள ஒரு செய்தியின் அட்டை) மற்றும் registerProductSwitcherMenuItem ஆகியவை Fusion-ன் முக்கிய காட்சிகளில் காட்டப்படாது. முதலாவதுக்கு பதிலாக registerPostDropdownMenuAction ஐப் பயன்படுத்தவும்.
  • registerMessageWillBeUpdatedHook Fusion-இல் ஒரு செய்தி திருத்தப்படும்போது இயக்கப்படாது. பதிலாக, சர்வரில் திருத்தங்களை MessageWillBeUpdated ஹூக்க்கு மூலம் சரிபார்க்கவும்.
  • registerActionAfterChannelCreation கிளாசிக் சேனல் உருவாக்க டயலாக்கிலிருந்து மட்டுமே இயக்கப்படுகிறது, இது Fusion தனது சேனல் உருவாக்கு டயலாக்கில் உள்ள மேலும் விருப்பங்கள்… இலிருந்து திறக்கிறது.
  • ஆப் பார் கூறுகள், அவற்றின் supportedProductIds எதுவாக இருந்தாலும் காட்டப்படுகின்றன.
  • registerNeedsTeamRoute மற்றும் registerCustomRoute இலிருந்து வரும் ரூட்கள், புரொடக்ட்கள் போல, கிளாசிக் பக்க ஃப்ரேமை வைத்திருக்கின்றன.

Antimatter மட்டுமே கொண்டிருக்கும் ஹூக்க்கள்

இந்த ரெஜிஸ்ட்ரி மெதாட்கள் Mattermost-இல் இல்லை. ஆப் அங்கும் வேலை செய்ய, அழைக்கும் முன் ஒரு மெதாட் இருக்கிறதா என்பதைச் சரிபார்க்கவும்:

if (typeof registry.registerComposerMenuItem === 'function') {
    registry.registerComposerMenuItem({
        text: 'Create a poll',
        icon: <i className='icon icon-chart-bar'/>,
        fusionIcon: 'poll',
        action: ({channelId, rootId}) => openPollCreation(channelId, rootId),
    });
} else {
    registry.registerChannelHeaderButtonAction(icon, (channel) => openPollCreation(channel.id), 'Create a poll', 'Create a poll');
}
மெதாட்அது என்ன சேர்க்கிறது
registerComposerMenuItem({text, icon, fusionIcon, action, shouldRender})இரண்டு இன்டர்ஃபேஸ்களிலும் செய்தி பெட்டியின் + மெனுவில் உள்ள ஒரு உருப்படி. action {channelId, rootId} ஐப் பெறுகிறது.
registerEmojiPickerTab({id, label, icon, fusionIcon, order, component, shouldRender, replacesGifPicker})செய்தி பெட்டியின் எமோஜி தேர்வினில் ஒரு தாவல், எடுத்துக்காட்டாக GIF அல்லது ஸ்டிக்கர்கள். Fusion-இல், order மதிப்பு 10-க்குக் குறைவாக இருக்கும் தாவல்கள் எமோஜி தாவலின் முன் வரும். இந்தக் கூறு channelId, rootId, filter, onFilterChange, onSelectDone, insertText, isFusion ஆகியவற்றையும், Fusion-இல் pickerKit (கீழே பார்க்கவும்) ஆகியவற்றையும் பெறுகிறது.
registerChannelViewPanel({matcher, component})சேனல் தலைப்பும் (channel header) செய்திகளுக்கும் இடையேயான ஒரு பலகை (panel); matcher(state, channel) தேர்ந்தெடுக்கும் சேனல்களுக்காக. குரல் சேனல்கள் (voice channels) செய்வது போல, செய்திகளையும் எழுதும் பகுதியையும் (composer) மறைக்க முடியும் (setMessagesVisible).
registerSidebarChannelFooterComponent(component)பக்கவாட்டுப் பலகையில் (sidebar) ஒரு சேனலின் கீழே உள்ள ஒரு வரி, உதாரணமாக அதன் அழைப்பில் (call) உள்ளவர்கள். இது channel ஐப் பெறுகிறது.
registerIntegrationsOption({title, description, fusionIcon, action, shouldRender})Fusion மட்டுமே: இணைப்புகள் பக்கங்களில், தனிப்பயன் எமோஜியின் அருகில் ஒரு பதிவு. GIF செயலி தனது தனிப்பயன் GIF-களை மற்றும் ஸ்டிக்கர்களை அங்கே சேர்க்கிறது.

எமோஜி தேர்வினில் காட்சிகளைச் சேர்த்து நிர்வகிக்கவும்

Fusion-இல், ஒரு எமோஜி தேர்வு தாவலுக்கு pickerKit பண்பு (prop) வழங்கப்படுகிறது: எமோஜி தாவல் தனது சொந்த சேர்ப்பு மற்றும் நிர்வாகக் காட்சிகளுக்குப் பயன்படுத்தும் கூறுகள். இதன் மூலம் ஒரு தாவலின் காட்சிகள் ஒரே மாதிரியாகத் தோன்றி தேர்வினுள் இருக்கும். GIF மற்றும் Memes செயலிகள் GIF-களை, ஸ்டிக்கர்களை மற்றும் மீம் டெம்பிளேட்டுகளைச் சேர்த்து நிர்வகிக்க இதைப் பயன்படுத்துகின்றன. இதில் version (1), usePickerView மற்றும் useOnEscape ஹூக்குகள், மேலும் PickerViewButtons (தேடல் பெட்டியின் அருகில் உள்ள + மற்றும் நிர்வாக பொத்தான்கள்), PickerViewFrame (பின் அம்புடன் கூடிய ஒரு காட்சி), PickerNotice, PickerField, PickerSearch, PickerDropZone மற்றும் PickerManageList கூறுகள் உள்ளன. Escape விசை ஒரு காட்சியிலிருந்து தாவலின் கட்டத்திற்கு (grid) பின் செல்கிறது. இந்தப் பண்பு உள்ளதா என்பதைச் சரிபார்க்கவும்: மற்ற ஹோஸ்ட்கள் (hosts) இதை விட்டுவிடுகின்றன, அப்போது தாவல் தனது சொந்த டயலாக்களை வைத்திருக்கும். வகைகள் (types) webapp/fusion/src/types/store/plugins.ts (EmojiPickerTabProps)-இல் மற்றும் கூறுகள் webapp/fusion/src/fusion/popovers/picker_views.tsx-இல் உள்ளன.

புதிய ஜன்னலில் உள்ள பலகை (panel)

Fusion, registerRightHandSidebarComponent-இன் கூறுக்கு இரண்டு கூடுதல் பண்புகளை வழங்குகிறது. இதன் மூலம் புதிய ஜன்னலில் திற செயல்பாடு செயலியின் முகப்புப் பக்கத்தில் அல்லாமல், பலகை இருந்த இடத்திலேயே திறக்கப்படும்:

  • setPanelState(state): பலகையின் இடம் மாறும்போது, உங்கள் செயலி வரையறுக்கும் ஒரு குறுகிய சரத்தை (string) கொண்டு இதை அழைக்கவும், எடுத்துக்காட்டாக 'note/<id>' அல்லது 'board/<id>/card/<id>', அல்லது அதன் முகப்புப் பக்கத்தில் null. இது ஜன்னலின் முகவரியில் (address) செல்கிறது, எனவே அதில் ரகசியத்தை எப்போதும் வைக்க வேண்டாம். 512 எழுத்துகளுக்கு மேல் நீளமானது அல்லது கட்டுப்பாட்டு எழுத்துகளைக் கொண்டிருந்தால், அது நீக்கப்படும்.
  • initialPanelState: புதிய ஜன்னலில், பலகை கொண்டிருந்த நிலை அல்லது undefined. இதை நம்பிக்கையற்ற உள்ளீடாக (untrusted input) கருதவும்: உள்நுழைந்த பயனராக (signed-in person) அந்தப் பொருளை மீண்டும் பெற்று, அவர் அதைத் திறக்க முடியவில்லை என்றால் செயலியின் முகப்புப் பக்கத்தை அல்லது 'பொருள் கிடைக்கவில்லை' (not-found) காட்சியைக் காட்டவும்.

பனல் மூடப்பட்டதும் அல்லது வேறு ஒரு அப்களின் பனல் அதன் இடம் பிடித்ததும், நிலை மறக்கப்படுகிறது. ஒரு பனலின் ஜன்னலை நீங்களே திறக்க, popoutRhsPlugin (இது window.WebappUtils.popouts-இலும் உள்ளது) நிலையை விருப்பத்திற்குரிய ஐந்தாவது வாதியாக ஏற்கிறது. குறிப்புகள், வெள்ளை பலகை, செய்வதற்கு, கான்பான் மற்றும் பிளேபுக்குகள் இதனைப் பயன்படுத்துகின்றன.

fusionIcon என்பது Fusion-இன் ஐகான் தொகுப்பில் உள்ள ஒரு ஐகானின் பெயர் (உதாரணமாக poll, sticker, calendar அல்லது image; webapp/fusion/src/fusion/components/icon ஐப் பார்க்கவும்). Fusion இதை icon ஐப் பதிலாகக் காட்டுகிறது, இதனால் அந்த உருப்படி மற்றவற்றுடன் பொருந்தும்.

அமைப்புகள்

plugin.json-இல் உள்ள settings_schema, அமைப்பு கன்சோல் › பிளகின்கள் இல் அப்களின் பக்கத்தை விவரிக்கிறது:

"settings_schema": {
  "header": "Forecasts come from the weather service below.",
  "settings": [
    {"key": "ServiceURL", "display_name": "Service URL", "type": "text", "default": "https://api.example.com"},
    {"key": "Units", "display_name": "Units", "type": "dropdown", "default": "metric",
     "options": [{"display_name": "Celsius", "value": "metric"}, {"display_name": "Fahrenheit", "value": "imperial"}]},
    {"key": "EnableAlerts", "display_name": "Severe weather alerts", "type": "bool", "default": false,
     "help_text": "Post alerts in the channels that follow a city."}
  ]
}

அமைப்பு வகைகள் (Setting types): bool, text, longtext, number, dropdown, radio, generated (ஒரு சீரற்ற ரகசியம்), username, மற்றும் custom (வெப் செயலி பகுதி registerAdminConsoleCustomSetting மூலம் பதிவு செய்யும் ஒரு கூறு மூலம் வரையப்படும்). அமைப்புகளை sections இல் தொகுக்க முடியும்.

சர்வர் பகுதி (server part) அவற்றை, விசைகள் (keys) பொருந்தும் புலங்களைக் (fields) கொண்ட ஒரு கட்டமைப்பில் (struct) படிக்கிறது:

type configuration struct {
	ServiceURL   string
	Units        string
	EnableAlerts bool
}

func (p *Plugin) OnConfigurationChange() error {
	var cfg configuration
	if err := p.API.LoadPluginConfiguration(&cfg); err != nil {
		return err
	}
	p.setConfiguration(&cfg)
	return nil
}

நிர்வாகிகள் (Admins) அவற்றை அமைப்புகளில் (configuration) PluginSettings.Plugins.<app id> கீழே, சிறிய எழுத்துக்களில் (lower case) விசைகளுடன் அமைக்கலாம் (பார்க்க நிர்வாக வழிகாட்டி).

மொழிபெயர்ப்புகள்

Antimatter 37 மொழிகளில் மொழிபெயர்க்கப்பட்டுள்ளது, இணைக்கப்பட்ட செயலிகளும் (bundled apps) அப்படித்தான். வெப் செயலி பகுதி (web app part) இதை இவ்வாறு செய்கிறது:

  1. ஒவ்வொரு சரத்தையும் (string) React Intl மூலம், ஒரு ID மற்றும் அதன் ஆங்கில உரைடன் எழுதுங்கள்: <FormattedMessage id='polls.create' defaultMessage='Create a poll'/> அல்லது defineMessages. ID-களுக்கு உங்கள் செயலியின் பெயரை முன்னொட்டு (prefix) ஆகப் பயன்படுத்தவும்.
  2. ஆங்கில சரங்களை webapp/i18n/en.json இல் வெளியேற்றுங்கள் (இணைக்கப்பட்ட செயலிகள் formatjs extract ஐப் பயன்படுத்துகின்றன).
  3. அதன் அருகே, ஒவ்வொரு மொழிக்கும் ஒரு கோப்பு சேர்க்கவும், அதே ID-களுடன்: fr.json, de.json, pt-BR.json, zh-CN.json…
  4. இவற்றை வெப் ஆப்-க்கு அளிக்கவும்; அது பயனரின் மொழியைக் கேட்கிறது:
    import fr from '../i18n/fr.json';
    import ptBR from '../i18n/pt-BR.json';
    
    const catalogs = {fr, 'pt-BR': ptBR};
    
    export function translationsFor(locale) {
        return catalogs[locale] || catalogs[locale.split('-')[0]] || {};
    }
    
    registry.registerTranslations(translationsFor);

ஒரு துணைச் சரம் இல்லையெனில், அதன் ஆங்கில defaultMessage பயன்படுத்தப்படும். சர்வர் பகுதி அனுப்பும் சரங்களுக்கு (கட்டளை பதில்கள், பாடட் செய்திகள்), pluginapi/i18n தொகுப்பு பண்டலில் சேர்க்கப்பட்ட மொழிபெயர்ப்பு கோப்புகளை (உதாரணமாக assets/i18n) ஏற்றி, ஒவ்வொரு பயனரின் மொழியிலும் ஒரு மொழிபெயர்ப்பாளரை வழங்குகிறது.

உருவாக்குதல், நிறுவல் மற்றும் பிழைநீக்கம்

Go மற்றும் Node.js (ஆப்பின் .nvmrc-ல் உள்ள பதிப்பு) தேவை. ஆப்பின் கோப்புறையில்:

கட்டளைஇது என்ன செய்கிறது
make distஎல்லா தளங்களுக்கும் சர்வர் பகுதியையும், வெப் ஆப் பகுதியையும் உருவாக்கி, பண்டலை dist/<app id>-<version>.tar.gz என எழுதுகிறது.
make testGo மற்றும் JavaScript சோதனைகளை இயக்குகிறது.
make check-styleகுறியீட்டைச் சரிபார்த்து (golangci-lint, ESLint), TypeScript வகைகளைச் சரிபார்க்கிறது.
make deployஉருவாக்கி, பின்னர் சர்வரில் பண்டலை நிறுவி இயக்குகிறது.
make watch, make deploy-from-watchமுதல் ஒன்று நீங்கள் சேமிக்கும் ஒவ்வொரு முறையும் வெப் ஆப் பகுதியை மறுஉருவாக்குகிறது; இரண்டாவது உருவாக்கியதைப் பண்டலாக்கி சர்வரில் நிறுவுகிறது.
make enable, make disable, make resetசர்வரில் ஆப்பை இயக்கு, முடக்கு அல்லது மறுதொடக்கம் செய்யவும்.
make logs, make logs-watchசர்வர் பதிவின் ஆப்பின் வரிசைகளைக் காட்டுகிறது.
make attachஇயங்கும் சர்வர் பகுதிக்கு Delve பிழைநீக்கியை இணைக்கிறது (முதலில் AM_DEBUG=1 உடன் உருவாக்கவும்).

make deploy மற்றும் மற்ற சர்வர் கட்டளைகள், உள்ளூர் முறை சாக்கெட்டைக் (உள்ளூர் முறை இயக்கப்பட்டால்) கண்டறிந்தால் அதைப் பயன்படுத்துகின்றன (/var/tmp/antimatter_local.socket, அல்லது AM_LOCALSOCKETPATH): இவற்றை உள்ளூர் முறையில் சர்வரின் கணினியில் இயக்கவும். இல்லையெனில், MM_SERVICESETTINGS_SITEURL மூலம் குறிப்பிடப்பட்ட சர்வரில் AM_ADMIN_TOKEN, அல்லது AM_ADMIN_USERNAME மற்றும் AM_ADMIN_PASSWORD மூலம் உள்நுழைகின்றன. உருவாக்க கருவிகள் இதுவரை தள URL-க்காக AM_ பெயரைப் படிக்கவில்லை.

ஒரு பண்டலை கைமுறையாக நிறுவுதல்

  • ஒரு அமைப்பு நிர்வாகி AM_PLUGINSETTINGS_ENABLEUPLOADS=true மூலம் பதிவேற்றங்களை அனுமதிக்கிறார் (இயல்பாக அணைக்கப்பட்டது; அமைப்பு கன்சோலில் மாற்றி இல்லை).
  • பின்னர் அமைப்பு கன்சோல் › பிளகின்கள் › பிளகின் மேலாண்மை › பிளகினை பதிவேற்றம், அல்லது amctl plugin add weather.tar.gz பின் amctl plugin enable com.example.weather.
  • சர்வர் பிளகின்களிற்கு சைகனேசு தேவை இயக்கப்பட்டுள்ளால், அது நம்பகமான விசையால் கையொப்பமிடப்பட்ட பட்டைகளை மட்டுமே ஏற்கும்; மற்ற அப்களை நிறுவல் காண்க.
ஒரு வளர்ச்சி சர்வரில் விரைவான மறுஉருவாக்கங்களுக்கு, சர்வரில் AM_SERVICESETTINGS_ENABLEDEVELOPER=true அமைக்கவும்: பின்னர் பிழைகள் அவற்றின் விவரங்களைக் கொண்டிருக்கும். உங்கள் ஷெல்லில் MM_SERVICESETTINGS_ENABLEDEVELOPER அமைக்கப்பட்டிருந்தால் மட்டுமே, பண்டலாக்கப்பட்ட ஆப்ஸ்களின் Makefile-கள் உங்கள் தளத்திற்கு மட்டுமே சர்வர் பகுதியை உருவாக்கும்.