From b783553d2c9b07b56bee3d0f3ddf8fd21e6fb3b2 Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Wed, 23 Aug 2023 19:46:46 -0400 Subject: [PATCH 01/15] Simplify config.go layout --- config.go | 103 ++++++++++++++++-------------------------------------- 1 file changed, 31 insertions(+), 72 deletions(-) diff --git a/config.go b/config.go index 332daa5e..62934887 100644 --- a/config.go +++ b/config.go @@ -10,6 +10,12 @@ import ( "gopkg.in/yaml.v2" ) +const ( + DefaultConfigFile = "devzat.yml" + DefaultDataDir = "devzat-data" + DefaultKeyFile = "devzat-sshkey" +) + type ConfigType struct { Port int `yaml:"port"` AltPort int `yaml:"alt_port"` @@ -25,17 +31,9 @@ type ConfigType struct { IntegrationConfig string `yaml:"integration_config"` } -// IntegrationsType stores information needed by integrations. -// Code that uses this should check if fields are nil. type IntegrationsType struct { - // Twitter stores the information needed for the Twitter integration. - // Check if it is enabled by checking if Twitter is nil. Twitter *TwitterInfo `yaml:"twitter"` - // Slack stores the information needed for the Slack integration. - // Check if it is enabled by checking if Slack is nil. - Slack *SlackInfo `yaml:"slack"` - // Discord stores the information needed for the Discord integration. - // Check if it is enabled by checking if Discord is nil. + Slack *SlackInfo `yaml:"slack"` Discord *DiscordInfo `yaml:"discord"` RPC *RPCInfo `yaml:"rpc"` @@ -49,23 +47,16 @@ type TwitterInfo struct { } type SlackInfo struct { - // Token is the Slack API token - Token string `yaml:"token"` - // ChannelID is the Slack channel to post to + Token string `yaml:"token"` ChannelID string `yaml:"channel_id"` - // Prefix is the prefix to prepend to messages from Slack when rendered for SSH users - Prefix string `yaml:"prefix"` + Prefix string `yaml:"prefix"` } type DiscordInfo struct { - // Token is the Discord API token - Token string `yaml:"token"` - // ChannelID is the ID of the channel to post to - ChannelID string `yaml:"channel_id"` - // Prefix is the prefix to prepend to messages from Discord when rendered for SSH users - Prefix string `yaml:"prefix"` - // Compact mode disables avatars to save vertical space - CompactMode bool `yaml:"compact_mode"` + Token string `yaml:"token"` + ChannelID string `yaml:"channel_id"` + Prefix string `yaml:"prefix"` + CompactMode bool `yaml:"compact_mode"` } type RPCInfo struct { @@ -74,13 +65,13 @@ type RPCInfo struct { } var ( - Config = ConfigType{ // first stores default config + Config = ConfigType{ Port: 2221, AltPort: 8080, ProfilePort: 5555, Scrollback: 16, - DataDir: "devzat-data", - KeyFile: "devzat-sshkey", + DataDir: DefaultDataDir, + KeyFile: DefaultKeyFile, IntegrationConfig: "", } @@ -91,16 +82,16 @@ var ( ) func init() { + readConfig() + setupLog() + initBacklog() + initIntegrations() +} + +func readConfig() { cfgFile := os.Getenv("DEVZAT_CONFIG") if cfgFile == "" { - cfgFile = "devzat.yml" - } - - errCheck := func(err error) { - if err != nil { - fmt.Println("err: " + err.Error()) - os.Exit(0) // match `return` behavior - } + cfgFile = DefaultConfigFile } if _, err := os.Stat(cfgFile); err != nil { @@ -123,20 +114,21 @@ func init() { err = os.MkdirAll(Config.DataDir, 0755) errCheck(err) +} +func setupLog() { logfile, err := os.OpenFile(Config.DataDir+string(os.PathSeparator)+"log.txt", os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0666) errCheck(err) Log = log.New(io.MultiWriter(logfile, os.Stdout), "", log.Ldate|log.Ltime|log.Lshortfile) +} - if os.Getenv("PORT") != "" { - Config.Port, err = strconv.Atoi(os.Getenv("PORT")) - errCheck(err) - } - +func initBacklog() { Backlog = make([]backlogMessage, Config.Scrollback) +} +func initIntegrations() { if Config.IntegrationConfig != "" { - d, err = os.ReadFile(Config.IntegrationConfig) + d, err := os.ReadFile(Config.IntegrationConfig) errCheck(err) err = yaml.UnmarshalStrict(d, &Integrations) errCheck(err) @@ -168,36 +160,3 @@ func init() { os.Exit(0) } } - - fmt.Println("Integration config loaded from " + Config.IntegrationConfig) - - if os.Getenv("DEVZAT_OFFLINE_SLACK") != "" { - fmt.Println("Disabling Slack") - Integrations.Slack = nil - } - if os.Getenv("DEVZAT_OFFLINE_DISCORD") != "" { - fmt.Println("Disabling Discord") - Integrations.Discord = nil - } - if os.Getenv("DEVZAT_OFFLINE_TWITTER") != "" { - fmt.Println("Disabling Twitter") - Integrations.Twitter = nil - } - if os.Getenv("DEVZAT_OFFLINE_RPC") != "" { - fmt.Println("Disabling RPC") - Integrations.RPC = nil - } - // Check for global offline for backwards compatibility - if os.Getenv("DEVZAT_OFFLINE") != "" { - fmt.Println("Offline mode") - Integrations.Slack = nil - Integrations.Discord = nil - Integrations.Twitter = nil - Integrations.RPC = nil - } - } - slackInit() - discordInit() - twitterInit() - rpcInit() -} From 68acec0bf5dd1c44d8d9f18c46387f9ddbe9c319 Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Thu, 21 Sep 2023 07:05:57 -0400 Subject: [PATCH 02/15] Update config.go --- config.go | 103 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 72 insertions(+), 31 deletions(-) diff --git a/config.go b/config.go index 6752b74c..ed612eb7 100644 --- a/config.go +++ b/config.go @@ -10,12 +10,6 @@ import ( "gopkg.in/yaml.v2" ) -const ( - DefaultConfigFile = "devzat.yml" - DefaultDataDir = "devzat-data" - DefaultKeyFile = "devzat-sshkey" -) - type ConfigType struct { Port int `yaml:"port"` AltPort int `yaml:"alt_port"` @@ -31,9 +25,17 @@ type ConfigType struct { IntegrationConfig string `yaml:"integration_config"` } +// IntegrationsType stores information needed by integrations. +// Code that uses this should check if fields are nil. type IntegrationsType struct { + // Twitter stores the information needed for the Twitter integration. + // Check if it is enabled by checking if Twitter is nil. Twitter *TwitterInfo `yaml:"twitter"` - Slack *SlackInfo `yaml:"slack"` + // Slack stores the information needed for the Slack integration. + // Check if it is enabled by checking if Slack is nil. + Slack *SlackInfo `yaml:"slack"` + // Discord stores the information needed for the Discord integration. + // Check if it is enabled by checking if Discord is nil. Discord *DiscordInfo `yaml:"discord"` RPC *RPCInfo `yaml:"rpc"` @@ -47,16 +49,23 @@ type TwitterInfo struct { } type SlackInfo struct { - Token string `yaml:"token"` + // Token is the Slack API token + Token string `yaml:"token"` + // ChannelID is the Slack channel to post to ChannelID string `yaml:"channel_id"` - Prefix string `yaml:"prefix"` + // Prefix is the prefix to prepend to messages from Slack when rendered for SSH users + Prefix string `yaml:"prefix"` } type DiscordInfo struct { - Token string `yaml:"token"` - ChannelID string `yaml:"channel_id"` - Prefix string `yaml:"prefix"` - CompactMode bool `yaml:"compact_mode"` + // Token is the Discord API token + Token string `yaml:"token"` + // ChannelID is the ID of the channel to post to + ChannelID string `yaml:"channel_id"` + // Prefix is the prefix to prepend to messages from Discord when rendered for SSH users + Prefix string `yaml:"prefix"` + // Compact mode disables avatars to save vertical space + CompactMode bool `yaml:"compact_mode"` } type RPCInfo struct { @@ -65,13 +74,13 @@ type RPCInfo struct { } var ( - Config = ConfigType{ + Config = ConfigType{ // first stores default config Port: 2221, AltPort: 8080, ProfilePort: 5555, Scrollback: 16, - DataDir: DefaultDataDir, - KeyFile: DefaultKeyFile, + DataDir: "devzat-data", + KeyFile: "devzat-sshkey", IntegrationConfig: "", } @@ -82,16 +91,16 @@ var ( ) func init() { - readConfig() - setupLog() - initBacklog() - initIntegrations() -} - -func readConfig() { cfgFile := os.Getenv("DEVZAT_CONFIG") if cfgFile == "" { - cfgFile = DefaultConfigFile + cfgFile = "devzat.yml" + } + + errCheck := func(err error) { + if err != nil { + fmt.Println("err: " + err.Error()) + os.Exit(0) // match `return` behavior + } } var d []byte @@ -114,21 +123,20 @@ func readConfig() { err := os.MkdirAll(Config.DataDir, 0755) errCheck(err) -} -func setupLog() { logfile, err := os.OpenFile(Config.DataDir+string(os.PathSeparator)+"log.txt", os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0666) errCheck(err) Log = log.New(io.MultiWriter(logfile, os.Stdout), "", log.Ldate|log.Ltime|log.Lshortfile) -} -func initBacklog() { + if os.Getenv("PORT") != "" { + Config.Port, err = strconv.Atoi(os.Getenv("PORT")) + errCheck(err) + } + Backlog = make([]backlogMessage, Config.Scrollback) -} -func initIntegrations() { if Config.IntegrationConfig != "" { - d, err := os.ReadFile(Config.IntegrationConfig) + d, err = os.ReadFile(Config.IntegrationConfig) errCheck(err) err = yaml.UnmarshalStrict(d, &Integrations) errCheck(err) @@ -160,3 +168,36 @@ func initIntegrations() { os.Exit(0) } } + + fmt.Println("Integration config loaded from " + Config.IntegrationConfig) + + if os.Getenv("DEVZAT_OFFLINE_SLACK") != "" { + fmt.Println("Disabling Slack") + Integrations.Slack = nil + } + if os.Getenv("DEVZAT_OFFLINE_DISCORD") != "" { + fmt.Println("Disabling Discord") + Integrations.Discord = nil + } + if os.Getenv("DEVZAT_OFFLINE_TWITTER") != "" { + fmt.Println("Disabling Twitter") + Integrations.Twitter = nil + } + if os.Getenv("DEVZAT_OFFLINE_RPC") != "" { + fmt.Println("Disabling RPC") + Integrations.RPC = nil + } + // Check for global offline for backwards compatibility + if os.Getenv("DEVZAT_OFFLINE") != "" { + fmt.Println("Offline mode") + Integrations.Slack = nil + Integrations.Discord = nil + Integrations.Twitter = nil + Integrations.RPC = nil + } + } + slackInit() + discordInit() + twitterInit() + rpcInit() +} From 983ec7938d1d8db50a7401ca99c6f2a79962ef52 Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Thu, 21 Sep 2023 07:09:17 -0400 Subject: [PATCH 03/15] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 001b19ea..ac6a9b1d 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ The rest ## Integrations -When self-hosting an instance, Devzat can integrate with Slack and/or Discord to bridge messages, and Twitter to post new-user announcements. +When self-hosting an instance, Devzat can integrate with Slack and/or Discord to bridge messages, and use the X social-meida platform to post new-user announcements. See the [Admin's Manual](Admin's%20Manual.md) for more info. Devzat has a plugin API you can use to integrate your own services: [documentation](plugin/README.md). Feel free to add a plugin to the main instance. Just ask for a token on the server. From cc249596a28d2271898d67c24901c154e596f9bf Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Thu, 21 Sep 2023 07:13:04 -0400 Subject: [PATCH 04/15] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ac6a9b1d..88571711 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ The rest ## Integrations -When self-hosting an instance, Devzat can integrate with Slack and/or Discord to bridge messages, and use the X social-meida platform to post new-user announcements. +When self-hosting an instance, Devzat can integrate with Slack and/or Discord to bridge messages, and use the X social-meida platform to post new-user announcements (now requires payment). See the [Admin's Manual](Admin's%20Manual.md) for more info. Devzat has a plugin API you can use to integrate your own services: [documentation](plugin/README.md). Feel free to add a plugin to the main instance. Just ask for a token on the server. From 8e08c6b14f62435962e87d8c57e7408218c9e58b Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Thu, 21 Sep 2023 07:20:01 -0400 Subject: [PATCH 05/15] Update Admin's Manual.md --- Admin's Manual.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Admin's Manual.md b/Admin's Manual.md index a7875fff..247cb420 100644 --- a/Admin's Manual.md +++ b/Admin's Manual.md @@ -121,9 +121,11 @@ discord: compact_mode: true # optional: disables avatars so messages take up less vertical space ``` -#### Using the Twitter integration +#### Using the X integration -Devzat supports sending updates about who is online to Twitter. You need to make a new Twitter app through a [Twitter developer account](https://developer.twitter.com/en/apply/user) +Devzat supports sending updates about who is online on the X social media platform. However, because of the switch from free to paid API keys, ![API Key Pricing](https://global.discourse-cdn.com/twitter/original/3X/b/4/b42b6b7e4db2db3f51db70b439e9f111105db04d.png) This feture no longer is no longer updated. If you want to improve the X bridges functionality, feel free to submit a PR. If you wish to continue, please follow the steps below. + +First, create a new app through a [Twitter developer account](https://developer.twitter.com/en/apply/user). Now add in the relevant keys to your integration config file: ```yaml From 8b73616396f208ab3af8c1d0e1023b30e5078667 Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Thu, 21 Sep 2023 07:20:59 -0400 Subject: [PATCH 06/15] Update Admin's Manual.md --- Admin's Manual.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Admin's Manual.md b/Admin's Manual.md index 247cb420..0a5c596b 100644 --- a/Admin's Manual.md +++ b/Admin's Manual.md @@ -123,7 +123,10 @@ discord: #### Using the X integration -Devzat supports sending updates about who is online on the X social media platform. However, because of the switch from free to paid API keys, ![API Key Pricing](https://global.discourse-cdn.com/twitter/original/3X/b/4/b42b6b7e4db2db3f51db70b439e9f111105db04d.png) This feture no longer is no longer updated. If you want to improve the X bridges functionality, feel free to submit a PR. If you wish to continue, please follow the steps below. +Devzat supports sending updates about who is online on the X social media platform. However, because of the switch from free to paid API keys, This feture no longer is no longer updated. +![API Key Pricing](https://global.discourse-cdn.com/twitter/original/3X/b/4/b42b6b7e4db2db3f51db70b439e9f111105db04d.png) + +If you want to improve the X bridges functionality, feel free to submit a PR. If you wish to continue, please follow the steps below. First, create a new app through a [Twitter developer account](https://developer.twitter.com/en/apply/user). From 98d4bfb4ca11f04341079cdba4b1da52bb7b28e5 Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Thu, 21 Sep 2023 07:23:11 -0400 Subject: [PATCH 07/15] Update Admin's Manual.md --- Admin's Manual.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Admin's Manual.md b/Admin's Manual.md index 0a5c596b..7565e3c4 100644 --- a/Admin's Manual.md +++ b/Admin's Manual.md @@ -122,9 +122,8 @@ discord: ``` #### Using the X integration - -Devzat supports sending updates about who is online on the X social media platform. However, because of the switch from free to paid API keys, This feture no longer is no longer updated. ![API Key Pricing](https://global.discourse-cdn.com/twitter/original/3X/b/4/b42b6b7e4db2db3f51db70b439e9f111105db04d.png) +Devzat supports sending updates about who is online on the X social media platform. However, because of the switch from free to paid API keys, This feture no longer is no longer updated. If you want to improve the X bridges functionality, feel free to submit a PR. If you wish to continue, please follow the steps below. From 05359777a13d654e3ab9d4ab42928313508e258d Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Thu, 21 Sep 2023 07:23:35 -0400 Subject: [PATCH 08/15] Update Admin's Manual.md --- Admin's Manual.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Admin's Manual.md b/Admin's Manual.md index 7565e3c4..d4204f4c 100644 --- a/Admin's Manual.md +++ b/Admin's Manual.md @@ -122,9 +122,10 @@ discord: ``` #### Using the X integration -![API Key Pricing](https://global.discourse-cdn.com/twitter/original/3X/b/4/b42b6b7e4db2db3f51db70b439e9f111105db04d.png) Devzat supports sending updates about who is online on the X social media platform. However, because of the switch from free to paid API keys, This feture no longer is no longer updated. +![API Key Pricing](https://global.discourse-cdn.com/twitter/original/3X/b/4/b42b6b7e4db2db3f51db70b439e9f111105db04d.png) + If you want to improve the X bridges functionality, feel free to submit a PR. If you wish to continue, please follow the steps below. First, create a new app through a [Twitter developer account](https://developer.twitter.com/en/apply/user). From ef60523e3060d5dc4a3185375dadb977c4247d8b Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Thu, 21 Sep 2023 07:24:55 -0400 Subject: [PATCH 09/15] Update Admin's Manual.md --- Admin's Manual.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Admin's Manual.md b/Admin's Manual.md index d4204f4c..4a912187 100644 --- a/Admin's Manual.md +++ b/Admin's Manual.md @@ -122,11 +122,11 @@ discord: ``` #### Using the X integration -Devzat supports sending updates about who is online on the X social media platform. However, because of the switch from free to paid API keys, This feture no longer is no longer updated. +Devzat supports sending updates about who is online on the X social media platform. However, because of the switch from free to paid API keys, This feature no longer is no longer updated. ![API Key Pricing](https://global.discourse-cdn.com/twitter/original/3X/b/4/b42b6b7e4db2db3f51db70b439e9f111105db04d.png) -If you want to improve the X bridges functionality, feel free to submit a PR. If you wish to continue, please follow the steps below. +If you want to improve or update the X bridges functionality, feel free to submit a PR. If you wish to continue, please follow the steps below: First, create a new app through a [Twitter developer account](https://developer.twitter.com/en/apply/user). From ba46129eef21f94784493bd2ffa5bd8467f24ad1 Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Fri, 22 Sep 2023 07:35:40 -0400 Subject: [PATCH 10/15] Prevent FalsePostives in Censor.go by adding .WithWholeWordMatch(true) the detector will only block bad words if there is a complete match. --- censor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/censor.go b/censor.go index ec5cece0..565d087c 100644 --- a/censor.go +++ b/censor.go @@ -5,7 +5,7 @@ import ( goaway "github.com/TwiN/go-away" ) -var detector = goaway.NewProfanityDetector().WithSanitizeSpaces(false) +var detector = goaway.NewProfanityDetector().WithSanitizeSpaces(false).WithWholeWordMatch(true) func rmBadWords(text string) string { if !Config.Censor { From 64537a8ef03200095dfe47e87c2dddbf7cabc094 Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Tue, 26 Sep 2023 15:57:17 -0400 Subject: [PATCH 11/15] Update README.md Co-authored-by: Ishan Goel --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 88571711..fea25954 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ The rest ## Integrations -When self-hosting an instance, Devzat can integrate with Slack and/or Discord to bridge messages, and use the X social-meida platform to post new-user announcements (now requires payment). +When self-hosting an instance, Devzat can integrate with Slack and/or Discord to bridge messages, and Twitter to post new-user announcements. See the [Admin's Manual](Admin's%20Manual.md) for more info. Devzat has a plugin API you can use to integrate your own services: [documentation](plugin/README.md). Feel free to add a plugin to the main instance. Just ask for a token on the server. From c47562232fefe14429b7b3118f250f351e412e1c Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Tue, 26 Sep 2023 16:25:47 -0400 Subject: [PATCH 12/15] Update Admin's Manual.md --- Admin's Manual.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Admin's Manual.md b/Admin's Manual.md index 4a912187..d7939d95 100644 --- a/Admin's Manual.md +++ b/Admin's Manual.md @@ -121,13 +121,11 @@ discord: compact_mode: true # optional: disables avatars so messages take up less vertical space ``` -#### Using the X integration -Devzat supports sending updates about who is online on the X social media platform. However, because of the switch from free to paid API keys, This feature no longer is no longer updated. +#### Using the Twitter integration +Devzat supports sending updates about who is online on Twitter. However, please note that Twitter has switched to paid API keys. ![API Key Pricing](https://global.discourse-cdn.com/twitter/original/3X/b/4/b42b6b7e4db2db3f51db70b439e9f111105db04d.png) -If you want to improve or update the X bridges functionality, feel free to submit a PR. If you wish to continue, please follow the steps below: - First, create a new app through a [Twitter developer account](https://developer.twitter.com/en/apply/user). Now add in the relevant keys to your integration config file: From e70060c90aeee3fb67ca433ab83478ab27952d42 Mon Sep 17 00:00:00 2001 From: Caen Jones <131218155+CaenJones@users.noreply.github.com> Date: Tue, 26 Sep 2023 16:44:29 -0400 Subject: [PATCH 13/15] Update Admin's Manual.md --- Admin's Manual.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Admin's Manual.md b/Admin's Manual.md index d7939d95..ce07ecb4 100644 --- a/Admin's Manual.md +++ b/Admin's Manual.md @@ -122,9 +122,7 @@ discord: ``` #### Using the Twitter integration -Devzat supports sending updates about who is online on Twitter. However, please note that Twitter has switched to paid API keys. - -![API Key Pricing](https://global.discourse-cdn.com/twitter/original/3X/b/4/b42b6b7e4db2db3f51db70b439e9f111105db04d.png) +Devzat supports sending updates about who is online on Twitter. However, please note that Twitter has switched to paid API keys. In order to setup the bridge please replicate the following steps on your devzat instance: First, create a new app through a [Twitter developer account](https://developer.twitter.com/en/apply/user). From b86829ce707b3aba9396186e873fcbcdfd9055d3 Mon Sep 17 00:00:00 2001 From: Ishan Goel Date: Tue, 26 Sep 2023 17:11:44 -0400 Subject: [PATCH 14/15] Update Admin's Manual.md --- Admin's Manual.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Admin's Manual.md b/Admin's Manual.md index ce07ecb4..ee81bf0b 100644 --- a/Admin's Manual.md +++ b/Admin's Manual.md @@ -122,9 +122,7 @@ discord: ``` #### Using the Twitter integration -Devzat supports sending updates about who is online on Twitter. However, please note that Twitter has switched to paid API keys. In order to setup the bridge please replicate the following steps on your devzat instance: - -First, create a new app through a [Twitter developer account](https://developer.twitter.com/en/apply/user). +Devzat supports sending updates about who is online on Twitter. Start by creating a new app through a [Twitter developer account](https://developer.twitter.com/en/apply/user) (note: Twitter's API is now paid). Now add in the relevant keys to your integration config file: ```yaml From e2c5335ece6dccdc8b4985d0f49fc079ce3dc9d1 Mon Sep 17 00:00:00 2001 From: Ishan Goel Date: Tue, 26 Sep 2023 17:12:34 -0400 Subject: [PATCH 15/15] Update Admin's Manual.md --- Admin's Manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Admin's Manual.md b/Admin's Manual.md index ee81bf0b..da2c3925 100644 --- a/Admin's Manual.md +++ b/Admin's Manual.md @@ -122,7 +122,7 @@ discord: ``` #### Using the Twitter integration -Devzat supports sending updates about who is online on Twitter. Start by creating a new app through a [Twitter developer account](https://developer.twitter.com/en/apply/user) (note: Twitter's API is now paid). +Devzat supports posting updates about who is online to Twitter. Start by creating a new app through a [Twitter developer account](https://developer.twitter.com/en/apply/user) (note: Twitter's API is now paid). Now add in the relevant keys to your integration config file: ```yaml