changes to code to add automation and an application to test detection
This commit is contained in:
parent
53c81bb129
commit
b23c129b79
|
@ -201,6 +201,11 @@ Setting the `MM_DEBUG` environment variable will invoke the debug builds. The si
|
||||||
* git remote add origin https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate.git
|
* git remote add origin https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate.git
|
||||||
* git push -u origin main
|
* git push -u origin main
|
||||||
|
|
||||||
|
###
|
||||||
|
###
|
||||||
|
###
|
||||||
|
###
|
||||||
|
|
||||||
## DONT FORGET TO DO THIS BEFORE COMMITING CHANGES
|
## DONT FORGET TO DO THIS BEFORE COMMITING CHANGES
|
||||||
* make clean
|
* make clean
|
||||||
* make
|
* make
|
||||||
|
|
Binary file not shown.
|
@ -4,9 +4,9 @@
|
||||||
"description": "This plugin serves as a starting point for writing a Mattermost plugin.",
|
"description": "This plugin serves as a starting point for writing a Mattermost plugin.",
|
||||||
"homepage_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate",
|
"homepage_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate",
|
||||||
"support_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate/issues",
|
"support_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate/issues",
|
||||||
"release_notes_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdatereleases/tag/v0.0.3",
|
"release_notes_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdatereleases/tag/v0.0.4",
|
||||||
"icon_path": "assets/starter-template-icon.svg",
|
"icon_path": "assets/starter-template-icon.svg",
|
||||||
"version": "0.0.3",
|
"version": "0.0.4",
|
||||||
"min_server_version": "6.2.1",
|
"min_server_version": "6.2.1",
|
||||||
"server": {
|
"server": {
|
||||||
"executables": {
|
"executables": {
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -18,9 +18,9 @@ const manifestStr = `
|
||||||
"description": "This plugin serves as a starting point for writing a Mattermost plugin.",
|
"description": "This plugin serves as a starting point for writing a Mattermost plugin.",
|
||||||
"homepage_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate",
|
"homepage_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate",
|
||||||
"support_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate/issues",
|
"support_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate/issues",
|
||||||
"release_notes_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdatereleases/tag/v0.0.3",
|
"release_notes_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdatereleases/tag/v0.0.4",
|
||||||
"icon_path": "assets/starter-template-icon.svg",
|
"icon_path": "assets/starter-template-icon.svg",
|
||||||
"version": "0.0.3",
|
"version": "0.0.4",
|
||||||
"min_server_version": "6.2.1",
|
"min_server_version": "6.2.1",
|
||||||
"server": {
|
"server": {
|
||||||
"executables": {
|
"executables": {
|
||||||
|
|
106
server/plugin.go
106
server/plugin.go
|
@ -6,6 +6,7 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/mattermost/mattermost/server/public/model"
|
"github.com/mattermost/mattermost/server/public/model"
|
||||||
"github.com/mattermost/mattermost/server/public/plugin"
|
"github.com/mattermost/mattermost/server/public/plugin"
|
||||||
|
@ -21,12 +22,15 @@ type Plugin struct {
|
||||||
// configuration is the active plugin configuration. Consult getConfiguration and
|
// configuration is the active plugin configuration. Consult getConfiguration and
|
||||||
// setConfiguration for usage.
|
// setConfiguration for usage.
|
||||||
configuration *configuration
|
configuration *configuration
|
||||||
|
|
||||||
|
// stopChannel is used to stop the background process monitor when the plugin is deactivated.
|
||||||
|
stopChannel chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Known game processes
|
// Known game processes
|
||||||
var knownGames = map[string]bool{
|
var knownGames = map[string]bool{
|
||||||
// Add known game processes here
|
|
||||||
"FortniteClient-Win64-Shipping.exe": true,
|
"FortniteClient-Win64-Shipping.exe": true,
|
||||||
|
"OpenDental.exe": true,
|
||||||
"gameprocess": true,
|
"gameprocess": true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,9 +52,66 @@ func (p *Plugin) GetActiveGame() (string, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "No game detected", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetUserGameStatus updates the user's custom status to reflect the game they are playing
|
||||||
|
func (p *Plugin) SetUserGameStatus(userID, game string) error {
|
||||||
|
status := fmt.Sprintf("playing: %s", game)
|
||||||
|
user, appErr := p.API.GetUser(userID)
|
||||||
|
if appErr != nil {
|
||||||
|
return appErr
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize the custom status to JSON
|
||||||
|
customStatus := model.CustomStatus{
|
||||||
|
Emoji: "video_game",
|
||||||
|
Text: status,
|
||||||
|
Duration: "0", // Status remains until changed
|
||||||
|
}
|
||||||
|
customStatusJSON, err := json.Marshal(customStatus)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the custom status in user.Props
|
||||||
|
user.Props = map[string]string{
|
||||||
|
"custom_status": string(customStatusJSON),
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, appErr := p.API.UpdateUser(user); appErr != nil {
|
||||||
|
return appErr
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MonitorGameStatus continuously monitors running processes and updates the user's status
|
||||||
|
func (p *Plugin) MonitorGameStatus(userID string) {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-p.stopChannel:
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
game, err := p.GetActiveGame()
|
||||||
|
if err != nil {
|
||||||
|
p.API.LogError("Failed to scan processes", "error", err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if game != "" {
|
||||||
|
if err := p.SetUserGameStatus(userID, game); err != nil {
|
||||||
|
p.API.LogError("Failed to set user game status", "error", err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sleep for a defined interval before scanning again
|
||||||
|
time.Sleep(30 * time.Second) // Scan every 30 seconds (can be configurable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExecuteCommand handles the `/setgame` command to manually set a game
|
||||||
func (p *Plugin) ExecuteCommand(c *plugin.Context, command *model.CommandArgs) (*model.CommandResponse, *model.AppError) {
|
func (p *Plugin) ExecuteCommand(c *plugin.Context, command *model.CommandArgs) (*model.CommandResponse, *model.AppError) {
|
||||||
split := strings.Fields(command.Command)
|
split := strings.Fields(command.Command)
|
||||||
|
|
||||||
|
@ -72,45 +133,27 @@ func (p *Plugin) ExecuteCommand(c *plugin.Context, command *model.CommandArgs) (
|
||||||
game = strings.Join(split[1:], " ")
|
game = strings.Join(split[1:], " ")
|
||||||
}
|
}
|
||||||
|
|
||||||
status := fmt.Sprintf("Playing: %s", game)
|
err = p.SetUserGameStatus(command.UserId, game)
|
||||||
user, appErr := p.API.GetUser(command.UserId)
|
|
||||||
if appErr != nil {
|
|
||||||
return nil, appErr
|
|
||||||
}
|
|
||||||
|
|
||||||
// Serialize the custom status to JSON
|
|
||||||
customStatus := model.CustomStatus{
|
|
||||||
Emoji: "video_game",
|
|
||||||
Text: status,
|
|
||||||
Duration: "0", // Optional: Time duration the status will stay
|
|
||||||
}
|
|
||||||
customStatusJSON, err := json.Marshal(customStatus)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &model.AppError{Message: "Failed to serialize custom status", StatusCode: 500}
|
return nil, &model.AppError{Message: "Failed to set game status", StatusCode: 500}
|
||||||
}
|
|
||||||
|
|
||||||
// Set the custom status in user.Props
|
|
||||||
user.Props = map[string]string{
|
|
||||||
"custom_status": string(customStatusJSON),
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, appErr := p.API.UpdateUser(user); appErr != nil {
|
|
||||||
return nil, appErr
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return &model.CommandResponse{
|
return &model.CommandResponse{
|
||||||
Text: fmt.Sprintf("Your status has been updated to: %s", status),
|
Text: fmt.Sprintf("your status has been updated to: %s", game),
|
||||||
}, nil
|
}, nil
|
||||||
default:
|
default:
|
||||||
return &model.CommandResponse{}, nil
|
return &model.CommandResponse{}, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OnActivate is called when the plugin is activated
|
||||||
func (p *Plugin) OnActivate() error {
|
func (p *Plugin) OnActivate() error {
|
||||||
|
p.stopChannel = make(chan struct{})
|
||||||
|
|
||||||
command := &model.Command{
|
command := &model.Command{
|
||||||
Trigger: "setgame",
|
Trigger: "setgame",
|
||||||
AutoComplete: true,
|
AutoComplete: true,
|
||||||
AutoCompleteDesc: "Set the game you are currently playing",
|
AutoCompleteDesc: "set the game you are currently playing",
|
||||||
AutoCompleteHint: "[game]",
|
AutoCompleteHint: "[game]",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,5 +161,14 @@ func (p *Plugin) OnActivate() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start background process monitoring for all users
|
||||||
|
go p.MonitorGameStatus("user_id_here") // Replace with actual user ID(s)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnDeactivate is called when the plugin is deactivated
|
||||||
|
func (p *Plugin) OnDeactivate() error {
|
||||||
|
close(p.stopChannel)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
2
webapp/dist/main.js
vendored
2
webapp/dist/main.js
vendored
File diff suppressed because one or more lines are too long
|
@ -7,9 +7,9 @@ const manifest = JSON.parse(`
|
||||||
"description": "This plugin serves as a starting point for writing a Mattermost plugin.",
|
"description": "This plugin serves as a starting point for writing a Mattermost plugin.",
|
||||||
"homepage_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate",
|
"homepage_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate",
|
||||||
"support_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate/issues",
|
"support_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdate/issues",
|
||||||
"release_notes_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdatereleases/tag/v0.0.3",
|
"release_notes_url": "https://gitlab.peanutsmediaserver.com/aaron/gameStatusUpdatereleases/tag/v0.0.4",
|
||||||
"icon_path": "assets/starter-template-icon.svg",
|
"icon_path": "assets/starter-template-icon.svg",
|
||||||
"version": "0.0.3",
|
"version": "0.0.4",
|
||||||
"min_server_version": "6.2.1",
|
"min_server_version": "6.2.1",
|
||||||
"server": {
|
"server": {
|
||||||
"executables": {
|
"executables": {
|
||||||
|
|
Loading…
Reference in a new issue