mirror of https://github.com/mautrix/go.git
101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
// Copyright (c) 2022 Tulir Asokan
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package commands
|
|
|
|
import (
|
|
"maunium.net/go/mautrix/bridge"
|
|
"maunium.net/go/mautrix/bridge/bridgeconfig"
|
|
"maunium.net/go/mautrix/event"
|
|
)
|
|
|
|
type MinimalHandler interface {
|
|
Run(*Event)
|
|
}
|
|
|
|
type MinimalHandlerFunc func(*Event)
|
|
|
|
func (mhf MinimalHandlerFunc) Run(ce *Event) {
|
|
mhf(ce)
|
|
}
|
|
|
|
type CommandState struct {
|
|
Next MinimalHandler
|
|
Action string
|
|
Meta interface{}
|
|
}
|
|
|
|
type CommandingUser interface {
|
|
bridge.User
|
|
GetCommandState() *CommandState
|
|
SetCommandState(*CommandState)
|
|
}
|
|
|
|
type Handler interface {
|
|
MinimalHandler
|
|
GetName() string
|
|
}
|
|
|
|
type AliasedHandler interface {
|
|
Handler
|
|
GetAliases() []string
|
|
}
|
|
|
|
type FullHandler struct {
|
|
Func func(*Event)
|
|
|
|
Name string
|
|
Aliases []string
|
|
Help HelpMeta
|
|
|
|
RequiresAdmin bool
|
|
RequiresPortal bool
|
|
RequiresLogin bool
|
|
|
|
RequiresEventLevel event.Type
|
|
}
|
|
|
|
func (fh *FullHandler) GetHelp() HelpMeta {
|
|
fh.Help.Command = fh.Name
|
|
return fh.Help
|
|
}
|
|
|
|
func (fh *FullHandler) GetName() string {
|
|
return fh.Name
|
|
}
|
|
|
|
func (fh *FullHandler) GetAliases() []string {
|
|
return fh.Aliases
|
|
}
|
|
|
|
func (fh *FullHandler) ShowInHelp(ce *Event) bool {
|
|
return !fh.RequiresAdmin || ce.User.GetPermissionLevel() >= bridgeconfig.PermissionLevelAdmin
|
|
}
|
|
|
|
func (fh *FullHandler) userHasRoomPermission(ce *Event) bool {
|
|
levels, err := ce.MainIntent().PowerLevels(ce.Ctx, ce.RoomID)
|
|
if err != nil {
|
|
ce.ZLog.Warn().Err(err).Msg("Failed to check room power levels")
|
|
ce.Reply("Failed to get room power levels to see if you're allowed to use that command")
|
|
return false
|
|
}
|
|
return levels.GetUserLevel(ce.User.GetMXID()) >= levels.GetEventLevel(fh.RequiresEventLevel)
|
|
}
|
|
|
|
func (fh *FullHandler) Run(ce *Event) {
|
|
if fh.RequiresAdmin && ce.User.GetPermissionLevel() < bridgeconfig.PermissionLevelAdmin {
|
|
ce.Reply("That command is limited to bridge administrators.")
|
|
} else if fh.RequiresEventLevel.Type != "" && ce.User.GetPermissionLevel() < bridgeconfig.PermissionLevelAdmin && !fh.userHasRoomPermission(ce) {
|
|
ce.Reply("That command requires room admin rights.")
|
|
} else if fh.RequiresPortal && ce.Portal == nil {
|
|
ce.Reply("That command can only be ran in portal rooms.")
|
|
} else if fh.RequiresLogin && !ce.User.IsLoggedIn() {
|
|
ce.Reply("That command requires you to be logged in.")
|
|
} else {
|
|
fh.Func(ce)
|
|
}
|
|
}
|