github.com/ashishbhate/mattermost-server@v5.11.1+incompatible/plugin/api.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package plugin
     5  
     6  import (
     7  	plugin "github.com/hashicorp/go-plugin"
     8  	"github.com/mattermost/mattermost-server/model"
     9  )
    10  
    11  // The API can be used to retrieve data or perform actions on behalf of the plugin. Most methods
    12  // have direct counterparts in the REST API and very similar behavior.
    13  //
    14  // Plugins obtain access to the API by embedding MattermostPlugin and accessing the API member
    15  // directly.
    16  type API interface {
    17  	// LoadPluginConfiguration loads the plugin's configuration. dest should be a pointer to a
    18  	// struct that the configuration JSON can be unmarshalled to.
    19  	LoadPluginConfiguration(dest interface{}) error
    20  
    21  	// RegisterCommand registers a custom slash command. When the command is triggered, your plugin
    22  	// can fulfill it via the ExecuteCommand hook.
    23  	RegisterCommand(command *model.Command) error
    24  
    25  	// UnregisterCommand unregisters a command previously registered via RegisterCommand.
    26  	UnregisterCommand(teamId, trigger string) error
    27  
    28  	// GetSession returns the session object for the Session ID
    29  	GetSession(sessionId string) (*model.Session, *model.AppError)
    30  
    31  	// GetConfig fetches the currently persisted config
    32  	GetConfig() *model.Config
    33  
    34  	// SaveConfig sets the given config and persists the changes
    35  	SaveConfig(config *model.Config) *model.AppError
    36  
    37  	// GetPluginConfig fetches the currently persisted config of plugin
    38  	//
    39  	// Minimum server version: 5.6
    40  	GetPluginConfig() map[string]interface{}
    41  
    42  	// SavePluginConfig sets the given config for plugin and persists the changes
    43  	//
    44  	// Minimum server version: 5.6
    45  	SavePluginConfig(config map[string]interface{}) *model.AppError
    46  
    47  	// GetBundlePath returns the absolute path where the plugin's bundle was unpacked.
    48  	//
    49  	// Minimum server version: 5.10
    50  	GetBundlePath() (string, error)
    51  
    52  	// GetLicense returns the current license used by the Mattermost server. Returns nil if the
    53  	// the server does not have a license.
    54  	//
    55  	// Minimum server version: 5.10
    56  	GetLicense() *model.License
    57  
    58  	// GetServerVersion return the current Mattermost server version
    59  	//
    60  	// Minimum server version: 5.4
    61  	GetServerVersion() string
    62  
    63  	// GetSystemInstallDate returns the time that Mattermost was first installed and ran.
    64  	//
    65  	// Minimum server version: 5.10
    66  	GetSystemInstallDate() (int64, *model.AppError)
    67  
    68  	// GetDiagnosticId returns a unique identifier used by the server for diagnostic reports.
    69  	//
    70  	// Minimum server version: 5.10
    71  	GetDiagnosticId() string
    72  
    73  	// CreateUser creates a user.
    74  	CreateUser(user *model.User) (*model.User, *model.AppError)
    75  
    76  	// DeleteUser deletes a user.
    77  	DeleteUser(userId string) *model.AppError
    78  
    79  	// GetUsers a list of users based on search options.
    80  	//
    81  	// Minimum server version: 5.10
    82  	GetUsers(options *model.UserGetOptions) ([]*model.User, *model.AppError)
    83  
    84  	// GetUser gets a user.
    85  	GetUser(userId string) (*model.User, *model.AppError)
    86  
    87  	// GetUserByEmail gets a user by their email address.
    88  	GetUserByEmail(email string) (*model.User, *model.AppError)
    89  
    90  	// GetUserByUsername gets a user by their username.
    91  	GetUserByUsername(name string) (*model.User, *model.AppError)
    92  
    93  	// GetUsersByUsernames gets users by their usernames.
    94  	//
    95  	// Minimum server version: 5.6
    96  	GetUsersByUsernames(usernames []string) ([]*model.User, *model.AppError)
    97  
    98  	// GetUsersInTeam gets users in team.
    99  	//
   100  	// Minimum server version: 5.6
   101  	GetUsersInTeam(teamId string, page int, perPage int) ([]*model.User, *model.AppError)
   102  
   103  	// GetTeamIcon gets the team icon.
   104  	//
   105  	// Minimum server version: 5.6
   106  	GetTeamIcon(teamId string) ([]byte, *model.AppError)
   107  
   108  	// SetTeamIcon sets the team icon.
   109  	//
   110  	// Minimum server version: 5.6
   111  	SetTeamIcon(teamId string, data []byte) *model.AppError
   112  
   113  	// RemoveTeamIcon removes the team icon.
   114  	//
   115  	// Minimum server version: 5.6
   116  	RemoveTeamIcon(teamId string) *model.AppError
   117  
   118  	// UpdateUser updates a user.
   119  	UpdateUser(user *model.User) (*model.User, *model.AppError)
   120  
   121  	// GetUserStatus will get a user's status.
   122  	GetUserStatus(userId string) (*model.Status, *model.AppError)
   123  
   124  	// GetUserStatusesByIds will return a list of user statuses based on the provided slice of user IDs.
   125  	GetUserStatusesByIds(userIds []string) ([]*model.Status, *model.AppError)
   126  
   127  	// UpdateUserStatus will set a user's status until the user, or another integration/plugin, sets it back to online.
   128  	// The status parameter can be: "online", "away", "dnd", or "offline".
   129  	UpdateUserStatus(userId, status string) (*model.Status, *model.AppError)
   130  
   131  	// UpdateUserActive deactivates or reactivates an user.
   132  	//
   133  	// Minimum server version: 5.8
   134  	UpdateUserActive(userId string, active bool) *model.AppError
   135  
   136  	// GetUsersInChannel returns a page of users in a channel. Page counting starts at 0.
   137  	// The sortBy parameter can be: "username" or "status".
   138  	//
   139  	// Minimum server version: 5.6
   140  	GetUsersInChannel(channelId, sortBy string, page, perPage int) ([]*model.User, *model.AppError)
   141  
   142  	// GetLDAPUserAttributes will return LDAP attributes for a user.
   143  	// The attributes parameter should be a list of attributes to pull.
   144  	// Returns a map with attribute names as keys and the user's attributes as values.
   145  	// Requires an enterprise license, LDAP to be configured and for the user to use LDAP as an authentication method.
   146  	//
   147  	// Minimum server version: 5.3
   148  	GetLDAPUserAttributes(userId string, attributes []string) (map[string]string, *model.AppError)
   149  
   150  	// CreateTeam creates a team.
   151  	CreateTeam(team *model.Team) (*model.Team, *model.AppError)
   152  
   153  	// DeleteTeam deletes a team.
   154  	DeleteTeam(teamId string) *model.AppError
   155  
   156  	// GetTeam gets all teams.
   157  	GetTeams() ([]*model.Team, *model.AppError)
   158  
   159  	// GetTeam gets a team.
   160  	GetTeam(teamId string) (*model.Team, *model.AppError)
   161  
   162  	// GetTeamByName gets a team by its name.
   163  	GetTeamByName(name string) (*model.Team, *model.AppError)
   164  
   165  	// GetTeamsUnreadForUser gets the unread message and mention counts for each team to which the given user belongs.
   166  	//
   167  	// Minimum server version: 5.6
   168  	GetTeamsUnreadForUser(userId string) ([]*model.TeamUnread, *model.AppError)
   169  
   170  	// UpdateTeam updates a team.
   171  	UpdateTeam(team *model.Team) (*model.Team, *model.AppError)
   172  
   173  	// SearchTeams search a team.
   174  	//
   175  	// Minimum server version: 5.8
   176  	SearchTeams(term string) ([]*model.Team, *model.AppError)
   177  
   178  	// GetTeamsForUser returns list of teams of given user ID.
   179  	//
   180  	// Minimum server version: 5.6
   181  	GetTeamsForUser(userId string) ([]*model.Team, *model.AppError)
   182  
   183  	// CreateTeamMember creates a team membership.
   184  	CreateTeamMember(teamId, userId string) (*model.TeamMember, *model.AppError)
   185  
   186  	// CreateTeamMember creates a team membership for all provided user ids.
   187  	CreateTeamMembers(teamId string, userIds []string, requestorId string) ([]*model.TeamMember, *model.AppError)
   188  
   189  	// DeleteTeamMember deletes a team membership.
   190  	DeleteTeamMember(teamId, userId, requestorId string) *model.AppError
   191  
   192  	// GetTeamMembers returns the memberships of a specific team.
   193  	GetTeamMembers(teamId string, page, perPage int) ([]*model.TeamMember, *model.AppError)
   194  
   195  	// GetTeamMember returns a specific membership.
   196  	GetTeamMember(teamId, userId string) (*model.TeamMember, *model.AppError)
   197  
   198  	// GetTeamMembersForUser returns all team memberships for a user.
   199  	//
   200  	// Minimum server version: 5.10
   201  	GetTeamMembersForUser(userId string, page int, perPage int) ([]*model.TeamMember, *model.AppError)
   202  
   203  	// UpdateTeamMemberRoles updates the role for a team membership.
   204  	UpdateTeamMemberRoles(teamId, userId, newRoles string) (*model.TeamMember, *model.AppError)
   205  
   206  	// CreateChannel creates a channel.
   207  	CreateChannel(channel *model.Channel) (*model.Channel, *model.AppError)
   208  
   209  	// DeleteChannel deletes a channel.
   210  	DeleteChannel(channelId string) *model.AppError
   211  
   212  	// GetPublicChannelsForTeam gets a list of all channels.
   213  	GetPublicChannelsForTeam(teamId string, page, perPage int) ([]*model.Channel, *model.AppError)
   214  
   215  	// GetChannel gets a channel.
   216  	GetChannel(channelId string) (*model.Channel, *model.AppError)
   217  
   218  	// GetChannelByName gets a channel by its name, given a team id.
   219  	GetChannelByName(teamId, name string, includeDeleted bool) (*model.Channel, *model.AppError)
   220  
   221  	// GetChannelByNameForTeamName gets a channel by its name, given a team name.
   222  	GetChannelByNameForTeamName(teamName, channelName string, includeDeleted bool) (*model.Channel, *model.AppError)
   223  
   224  	// GetChannelsForTeamForUser gets a list of channels for given user ID in given team ID.
   225  	//
   226  	// Minimum server version: 5.6
   227  	GetChannelsForTeamForUser(teamId, userId string, includeDeleted bool) ([]*model.Channel, *model.AppError)
   228  
   229  	// GetChannelStats gets statistics for a channel.
   230  	//
   231  	// Minimum server version: 5.6
   232  	GetChannelStats(channelId string) (*model.ChannelStats, *model.AppError)
   233  
   234  	// GetDirectChannel gets a direct message channel.
   235  	// If the channel does not exist it will create it.
   236  	GetDirectChannel(userId1, userId2 string) (*model.Channel, *model.AppError)
   237  
   238  	// GetGroupChannel gets a group message channel.
   239  	// If the channel does not exist it will create it.
   240  	GetGroupChannel(userIds []string) (*model.Channel, *model.AppError)
   241  
   242  	// UpdateChannel updates a channel.
   243  	UpdateChannel(channel *model.Channel) (*model.Channel, *model.AppError)
   244  
   245  	// SearchChannels returns the channels on a team matching the provided search term.
   246  	//
   247  	// Minimum server version: 5.6
   248  	SearchChannels(teamId string, term string) ([]*model.Channel, *model.AppError)
   249  
   250  	// SearchUsers returns a list of users based on some search criteria.
   251  	//
   252  	// Minimum server version: 5.6
   253  	SearchUsers(search *model.UserSearch) ([]*model.User, *model.AppError)
   254  
   255  	// SearchPostsInTeam returns a list of posts in a specific team that match the given params.
   256  	//
   257  	// Minimum server version: 5.10
   258  	SearchPostsInTeam(teamId string, paramsList []*model.SearchParams) ([]*model.Post, *model.AppError)
   259  
   260  	// AddChannelMember creates a channel membership for a user.
   261  	AddChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError)
   262  
   263  	// GetChannelMember gets a channel membership for a user.
   264  	GetChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError)
   265  
   266  	// GetChannelMembers gets a channel membership for all users.
   267  	//
   268  	// Minimum server version: 5.6
   269  	GetChannelMembers(channelId string, page, perPage int) (*model.ChannelMembers, *model.AppError)
   270  
   271  	// GetChannelMembersByIds gets a channel membership for a particular User
   272  	//
   273  	// Minimum server version: 5.6
   274  	GetChannelMembersByIds(channelId string, userIds []string) (*model.ChannelMembers, *model.AppError)
   275  
   276  	// GetChannelMembersForUser returns all channel memberships on a team for a user.
   277  	//
   278  	// Minimum server version: 5.10
   279  	GetChannelMembersForUser(teamId, userId string, page, perPage int) ([]*model.ChannelMember, *model.AppError)
   280  
   281  	// UpdateChannelMemberRoles updates a user's roles for a channel.
   282  	UpdateChannelMemberRoles(channelId, userId, newRoles string) (*model.ChannelMember, *model.AppError)
   283  
   284  	// UpdateChannelMemberNotifications updates a user's notification properties for a channel.
   285  	UpdateChannelMemberNotifications(channelId, userId string, notifications map[string]string) (*model.ChannelMember, *model.AppError)
   286  
   287  	// DeleteChannelMember deletes a channel membership for a user.
   288  	DeleteChannelMember(channelId, userId string) *model.AppError
   289  
   290  	// CreatePost creates a post.
   291  	CreatePost(post *model.Post) (*model.Post, *model.AppError)
   292  
   293  	// AddReaction add a reaction to a post.
   294  	//
   295  	// Minimum server version: 5.3
   296  	AddReaction(reaction *model.Reaction) (*model.Reaction, *model.AppError)
   297  
   298  	// RemoveReaction remove a reaction from a post.
   299  	//
   300  	// Minimum server version: 5.3
   301  	RemoveReaction(reaction *model.Reaction) *model.AppError
   302  
   303  	// GetReaction get the reactions of a post.
   304  	//
   305  	// Minimum server version: 5.3
   306  	GetReactions(postId string) ([]*model.Reaction, *model.AppError)
   307  
   308  	// SendEphemeralPost creates an ephemeral post.
   309  	SendEphemeralPost(userId string, post *model.Post) *model.Post
   310  
   311  	// UpdateEphemeralPost updates an ephemeral message previously sent to the user.
   312  	// EXPERIMENTAL: This API is experimental and can be changed without advance notice.
   313  	UpdateEphemeralPost(userId string, post *model.Post) *model.Post
   314  
   315  	// DeleteEphemeralPost deletes an ephemeral message previously sent to the user.
   316  	// EXPERIMENTAL: This API is experimental and can be changed without advance notice.
   317  	DeleteEphemeralPost(userId string, post *model.Post)
   318  
   319  	// DeletePost deletes a post.
   320  	DeletePost(postId string) *model.AppError
   321  
   322  	// GetPostThread gets a post with all the other posts in the same thread.
   323  	//
   324  	// Minimum server version: 5.6
   325  	GetPostThread(postId string) (*model.PostList, *model.AppError)
   326  
   327  	// GetPost gets a post.
   328  	GetPost(postId string) (*model.Post, *model.AppError)
   329  
   330  	// GetPostsSince gets posts created after a specified time as Unix time in milliseconds.
   331  	//
   332  	// Minimum server version: 5.6
   333  	GetPostsSince(channelId string, time int64) (*model.PostList, *model.AppError)
   334  
   335  	// GetPostsAfter gets a page of posts that were posted after the post provided.
   336  	//
   337  	// Minimum server version: 5.6
   338  	GetPostsAfter(channelId, postId string, page, perPage int) (*model.PostList, *model.AppError)
   339  
   340  	// GetPostsBefore gets a page of posts that were posted before the post provided.
   341  	//
   342  	// Minimum server version: 5.6
   343  	GetPostsBefore(channelId, postId string, page, perPage int) (*model.PostList, *model.AppError)
   344  
   345  	// GetPostsForChannel gets a list of posts for a channel.
   346  	//
   347  	// Minimum server version: 5.6
   348  	GetPostsForChannel(channelId string, page, perPage int) (*model.PostList, *model.AppError)
   349  
   350  	// GetTeamStats gets a team's statistics
   351  	//
   352  	// Minimum server version: 5.8
   353  	GetTeamStats(teamId string) (*model.TeamStats, *model.AppError)
   354  
   355  	// UpdatePost updates a post.
   356  	UpdatePost(post *model.Post) (*model.Post, *model.AppError)
   357  
   358  	// GetProfileImage gets user's profile image.
   359  	//
   360  	// Minimum server version: 5.6
   361  	GetProfileImage(userId string) ([]byte, *model.AppError)
   362  
   363  	// SetProfileImage sets a user's profile image.
   364  	//
   365  	// Minimum server version: 5.6
   366  	SetProfileImage(userId string, data []byte) *model.AppError
   367  
   368  	// GetEmojiList returns a page of custom emoji on the system.
   369  	//
   370  	// The sortBy parameter can be: "name".
   371  	//
   372  	// Minimum server version: 5.6
   373  	GetEmojiList(sortBy string, page, perPage int) ([]*model.Emoji, *model.AppError)
   374  
   375  	// GetEmojiByName gets an emoji by it's name.
   376  	//
   377  	// Minimum server version: 5.6
   378  	GetEmojiByName(name string) (*model.Emoji, *model.AppError)
   379  
   380  	// GetEmoji returns a custom emoji based on the emojiId string.
   381  	//
   382  	// Minimum server version: 5.6
   383  	GetEmoji(emojiId string) (*model.Emoji, *model.AppError)
   384  
   385  	// CopyFileInfos duplicates the FileInfo objects referenced by the given file ids,
   386  	// recording the given user id as the new creator and returning the new set of file ids.
   387  	//
   388  	// The duplicate FileInfo objects are not initially linked to a post, but may now be passed
   389  	// to CreatePost. Use this API to duplicate a post and its file attachments without
   390  	// actually duplicating the uploaded files.
   391  	CopyFileInfos(userId string, fileIds []string) ([]string, *model.AppError)
   392  
   393  	// GetFileInfo gets a File Info for a specific fileId
   394  	//
   395  	// Minimum server version: 5.3
   396  	GetFileInfo(fileId string) (*model.FileInfo, *model.AppError)
   397  
   398  	// GetFile gets content of a file by it's ID
   399  	//
   400  	// Minimum Server version: 5.8
   401  	GetFile(fileId string) ([]byte, *model.AppError)
   402  
   403  	// GetFileLink gets the public link to a file by fileId.
   404  	//
   405  	// Minimum server version: 5.6
   406  	GetFileLink(fileId string) (string, *model.AppError)
   407  
   408  	// ReadFileAtPath reads the file from the backend for a specific path
   409  	//
   410  	// Minimum server version: 5.3
   411  	ReadFile(path string) ([]byte, *model.AppError)
   412  
   413  	// GetEmojiImage returns the emoji image.
   414  	//
   415  	// Minimum server version: 5.6
   416  	GetEmojiImage(emojiId string) ([]byte, string, *model.AppError)
   417  
   418  	// UploadFile will upload a file to a channel using a multipart request, to be later attached to a post.
   419  	//
   420  	// Minimum server version: 5.6
   421  	UploadFile(data []byte, channelId string, filename string) (*model.FileInfo, *model.AppError)
   422  
   423  	// OpenInteractiveDialog will open an interactive dialog on a user's client that
   424  	// generated the trigger ID. Used with interactive message buttons, menus
   425  	// and slash commands.
   426  	//
   427  	// Minimum server version: 5.6
   428  	OpenInteractiveDialog(dialog model.OpenDialogRequest) *model.AppError
   429  
   430  	// Plugin Section
   431  
   432  	// GetPlugins will return a list of plugin manifests for currently active plugins.
   433  	//
   434  	// Minimum server version: 5.6
   435  	GetPlugins() ([]*model.Manifest, *model.AppError)
   436  
   437  	// EnablePlugin will enable an plugin installed.
   438  	//
   439  	// Minimum server version: 5.6
   440  	EnablePlugin(id string) *model.AppError
   441  
   442  	// DisablePlugin will disable an enabled plugin.
   443  	//
   444  	// Minimum server version: 5.6
   445  	DisablePlugin(id string) *model.AppError
   446  
   447  	// RemovePlugin will disable and delete a plugin.
   448  	//
   449  	// Minimum server version: 5.6
   450  	RemovePlugin(id string) *model.AppError
   451  
   452  	// GetPluginStatus will return the status of a plugin.
   453  	//
   454  	// Minimum server version: 5.6
   455  	GetPluginStatus(id string) (*model.PluginStatus, *model.AppError)
   456  
   457  	// KV Store Section
   458  
   459  	// KVSet will store a key-value pair, unique per plugin.
   460  	KVSet(key string, value []byte) *model.AppError
   461  
   462  	// KVSet will store a key-value pair, unique per plugin with an expiry time
   463  	//
   464  	// Minimum server version: 5.6
   465  	KVSetWithExpiry(key string, value []byte, expireInSeconds int64) *model.AppError
   466  
   467  	// KVGet will retrieve a value based on the key. Returns nil for non-existent keys.
   468  	KVGet(key string) ([]byte, *model.AppError)
   469  
   470  	// KVDelete will remove a key-value pair. Returns nil for non-existent keys.
   471  	KVDelete(key string) *model.AppError
   472  
   473  	// KVDeleteAll will remove all key-value pairs for a plugin.
   474  	//
   475  	// Minimum server version: 5.6
   476  	KVDeleteAll() *model.AppError
   477  
   478  	// KVList will list all keys for a plugin.
   479  	//
   480  	// Minimum server version: 5.6
   481  	KVList(page, perPage int) ([]string, *model.AppError)
   482  
   483  	// PublishWebSocketEvent sends an event to WebSocket connections.
   484  	// event is the type and will be prepended with "custom_<pluginid>_".
   485  	// payload is the data sent with the event. Interface values must be primitive Go types or mattermost-server/model types.
   486  	// broadcast determines to which users to send the event.
   487  	PublishWebSocketEvent(event string, payload map[string]interface{}, broadcast *model.WebsocketBroadcast)
   488  
   489  	// HasPermissionTo check if the user has the permission at system scope.
   490  	//
   491  	// Minimum server version: 5.3
   492  	HasPermissionTo(userId string, permission *model.Permission) bool
   493  
   494  	// HasPermissionToTeam check if the user has the permission at team scope.
   495  	//
   496  	// Minimum server version: 5.3
   497  	HasPermissionToTeam(userId, teamId string, permission *model.Permission) bool
   498  
   499  	// HasPermissionToChannel check if the user has the permission at channel scope.
   500  	//
   501  	// Minimum server version: 5.3
   502  	HasPermissionToChannel(userId, channelId string, permission *model.Permission) bool
   503  
   504  	// LogDebug writes a log message to the Mattermost server log file.
   505  	// Appropriate context such as the plugin name will already be added as fields so plugins
   506  	// do not need to add that info.
   507  	// keyValuePairs should be primitive go types or other values that can be encoded by encoding/gob
   508  	LogDebug(msg string, keyValuePairs ...interface{})
   509  
   510  	// LogInfo writes a log message to the Mattermost server log file.
   511  	// Appropriate context such as the plugin name will already be added as fields so plugins
   512  	// do not need to add that info.
   513  	// keyValuePairs should be primitive go types or other values that can be encoded by encoding/gob
   514  	LogInfo(msg string, keyValuePairs ...interface{})
   515  
   516  	// LogError writes a log message to the Mattermost server log file.
   517  	// Appropriate context such as the plugin name will already be added as fields so plugins
   518  	// do not need to add that info.
   519  	// keyValuePairs should be primitive go types or other values that can be encoded by encoding/gob
   520  	LogError(msg string, keyValuePairs ...interface{})
   521  
   522  	// LogWarn writes a log message to the Mattermost server log file.
   523  	// Appropriate context such as the plugin name will already be added as fields so plugins
   524  	// do not need to add that info.
   525  	// keyValuePairs should be primitive go types or other values that can be encoded by encoding/gob
   526  	LogWarn(msg string, keyValuePairs ...interface{})
   527  
   528  	// SendMail sends an email to a specific address
   529  	//
   530  	// Minimum server version: 5.7
   531  	SendMail(to, subject, htmlBody string) *model.AppError
   532  
   533  	// CreateBot creates the given bot and corresponding user.
   534  	//
   535  	// Minimum server version: 5.10
   536  	CreateBot(bot *model.Bot) (*model.Bot, *model.AppError)
   537  
   538  	// PatchBot applies the given patch to the bot and corresponding user.
   539  	//
   540  	// Minimum server version: 5.10
   541  	PatchBot(botUserId string, botPatch *model.BotPatch) (*model.Bot, *model.AppError)
   542  
   543  	// GetBot returns the given bot.
   544  	//
   545  	// Minimum server version: 5.10
   546  	GetBot(botUserId string, includeDeleted bool) (*model.Bot, *model.AppError)
   547  
   548  	// GetBots returns the requested page of bots.
   549  	//
   550  	// Minimum server version: 5.10
   551  	GetBots(options *model.BotGetOptions) ([]*model.Bot, *model.AppError)
   552  
   553  	// UpdateBotActive marks a bot as active or inactive, along with its corresponding user.
   554  	//
   555  	// Minimum server version: 5.10
   556  	UpdateBotActive(botUserId string, active bool) (*model.Bot, *model.AppError)
   557  
   558  	// PermanentDeleteBot permanently deletes a bot and its corresponding user.
   559  	//
   560  	// Minimum server version: 5.10
   561  	PermanentDeleteBot(botUserId string) *model.AppError
   562  }
   563  
   564  var handshake = plugin.HandshakeConfig{
   565  	ProtocolVersion:  1,
   566  	MagicCookieKey:   "MATTERMOST_PLUGIN",
   567  	MagicCookieValue: "Securely message teams, anywhere.",
   568  }