瀏覽代碼

efficiency, cleanup, etc

Drn 2 年之前
父節點
當前提交
74eb3a6054
共有 2 個文件被更改,包括 163 次插入104 次删除
  1. 83 29
      config.go
  2. 80 75
      main.go

+ 83 - 29
config.go

@@ -18,7 +18,7 @@ var (
 	config = defaultConfiguration()
 )
 
-//#region Credentials
+//#region Config, Credentials
 
 var (
 	placeholderToken    string = "REPLACE_WITH_YOUR_TOKEN_OR_DELETE_LINE"
@@ -43,7 +43,7 @@ type configurationCredentials struct {
 
 //#endregion
 
-//#region Configuration
+//#region Config, Main
 
 // defConfig_ = Config Default
 // Needed for settings used without redundant nil checks, and settings defaulting + creation
@@ -58,6 +58,22 @@ var (
 	defConfig_PresenceType         discordgo.GameType = discordgo.GameTypeGame
 	defConfig_ReactWhenDownloaded  bool               = true
 	defConfig_InflateDownloadCount int64              = 0
+
+	// These are only defaults to "fix" when loading settings for when people put stupid values
+	defConfig_ProcessLimit int = 32
+
+	defConfig_DiscordTimeout   int = 180
+	defConfig_DownloadTimeout  int = 60
+	defConfig_DownloadRetryMax int = 3
+
+	defConfig_CheckupRate         int = 30
+	defConfig_ConnectionCheckRate int = 5
+	defConfig_PresenceRefreshRate int = 3
+
+	defConfig_FilenameDateFormat string = "2006-01-02_15-04-05"
+	defConfig_FilenameFormat     string = "{{date}} {{shortID}} {{file}}"
+
+	defConfig_HistoryMaxJobs int = 3
 )
 
 func defaultConfiguration() configuration {
@@ -75,16 +91,16 @@ func defaultConfiguration() configuration {
 		AdminChannels: []configurationAdminChannel{},
 
 		// Program Settings
-		ProcessLimit:         32,
+		ProcessLimit:         defConfig_ProcessLimit,
 		Debug:                defConfig_Debug,
 		SettingsOutput:       true,
 		MessageOutput:        true,
 		MessageOutputHistory: false,
 
 		DiscordLogLevel:      discordgo.LogError,
-		DiscordTimeout:       180,
-		DownloadTimeout:      60,
-		DownloadRetryMax:     3,
+		DiscordTimeout:       defConfig_DiscordTimeout,
+		DownloadTimeout:      defConfig_DownloadTimeout,
+		DownloadRetryMax:     defConfig_DownloadRetryMax,
 		ExitOnBadConnection:  false,
 		GithubUpdateChecking: defConfig_GithubUpdateChecking,
 
@@ -94,9 +110,9 @@ func defaultConfiguration() configuration {
 		InflateDownloadCount: &defConfig_InflateDownloadCount,
 		EuropeanNumbers:      false,
 
-		CheckupRate:         30,
-		ConnectionCheckRate: 5,
-		PresenceRefreshRate: 3,
+		CheckupRate:         defConfig_CheckupRate,
+		ConnectionCheckRate: defConfig_ConnectionCheckRate,
+		PresenceRefreshRate: defConfig_PresenceRefreshRate,
 
 		// Source Setup Defaults
 		Save:          true,
@@ -110,8 +126,8 @@ func defaultConfiguration() configuration {
 		SendFileDirectly:   true,
 		SendFileCaption:    "",
 
-		FilenameDateFormat: "2006-01-02_15-04-05",
-		FilenameFormat:     "{{date}} {{shortID}} {{file}}",
+		FilenameDateFormat: defConfig_FilenameDateFormat,
+		FilenameFormat:     defConfig_FilenameFormat,
 
 		// Appearance
 		PresenceEnabled:            defConfig_PresenceEnabled,
@@ -122,7 +138,7 @@ func defaultConfiguration() configuration {
 		HistoryTyping:              true,
 
 		// History
-		HistoryMaxJobs:        3,
+		HistoryMaxJobs:        defConfig_HistoryMaxJobs,
 		AutoHistory:           false,
 		AutoHistoryBefore:     "",
 		AutoHistorySince:      "",
@@ -253,10 +269,10 @@ type configuration struct {
 	AllBlacklistServers    *[]string             `json:"allBlacklistServers,omitempty"`
 	AllBlacklistCategories *[]string             `json:"allBlacklistCategories,omitempty"`
 	AllBlacklistChannels   *[]string             `json:"allBlacklistChannels,omitempty"`
-	Users                  []configurationSource `json:"users"`
-	Servers                []configurationSource `json:"servers"`
-	Categories             []configurationSource `json:"categories"`
-	Channels               []configurationSource `json:"channels"`
+	Users                  []configurationSource `json:"users,omitempty"`
+	Servers                []configurationSource `json:"servers,omitempty"`
+	Categories             []configurationSource `json:"categories,omitempty"`
+	Channels               []configurationSource `json:"channels,omitempty"`
 }
 
 type constStruct struct {
@@ -265,7 +281,7 @@ type constStruct struct {
 
 //#endregion
 
-//#region Sources
+//#region Config, Sources
 
 // Needed for settings used without redundant nil checks, and settings defaulting + creation
 var (
@@ -383,7 +399,7 @@ type configurationSourceLog struct {
 
 //#endregion
 
-//#region Admin Channels
+//#region Config, Admin Channels
 
 var (
 	adefConfig_LogProgram     bool = false
@@ -403,6 +419,8 @@ type configurationAdminChannel struct {
 
 //#endregion
 
+//#region Management
+
 func loadConfig() error {
 	// Determine json type
 	if _, err := os.Stat(configFileBase + ".jsonc"); err == nil {
@@ -412,8 +430,9 @@ func loadConfig() error {
 		configFile = configFileBase + ".json"
 		configFileC = false
 	}
-	// .
+
 	log.Println(lg("Settings", "loadConfig", color.YellowString, "Loading from \"%s\"...", configFile))
+
 	// Load settings
 	configContent, err := os.ReadFile(configFile)
 	if err != nil {
@@ -465,8 +484,7 @@ func loadConfig() error {
 		}
 		config = newConfig
 
-		// Channel Config Defaults
-		// this is dumb but don't see a better way to initialize defaults
+		// Source Defaults
 		for i := 0; i < len(config.Channels); i++ {
 			sourceDefault(&config.Channels[i])
 		}
@@ -482,11 +500,43 @@ func loadConfig() error {
 		if config.All != nil {
 			sourceDefault(config.All)
 		}
-
+		// Admin Channel Defaults
 		for i := 0; i < len(config.AdminChannels); i++ {
 			adminChannelDefault(&config.AdminChannels[i])
 		}
 
+		// Checks & Fixes
+		if config.ProcessLimit < 1 {
+			config.ProcessLimit = defConfig_ProcessLimit
+		}
+		if config.DiscordTimeout < 10 {
+			config.DiscordTimeout = defConfig_DiscordTimeout
+		}
+		if config.DownloadTimeout < 10 {
+			config.DownloadTimeout = defConfig_DownloadTimeout
+		}
+		if config.DownloadRetryMax < 1 {
+			config.DownloadRetryMax = defConfig_DownloadRetryMax
+		}
+		if config.CheckupRate < 1 {
+			config.CheckupRate = defConfig_CheckupRate
+		}
+		if config.ConnectionCheckRate < 1 {
+			config.ConnectionCheckRate = defConfig_ConnectionCheckRate
+		}
+		if config.PresenceRefreshRate < 1 {
+			config.PresenceRefreshRate = defConfig_PresenceRefreshRate
+		}
+		if config.FilenameDateFormat == "" {
+			config.FilenameDateFormat = defConfig_FilenameDateFormat
+		}
+		if config.FilenameFormat == "" {
+			config.FilenameFormat = defConfig_FilenameFormat
+		}
+		if config.HistoryMaxJobs < 1 {
+			config.HistoryMaxJobs = defConfig_HistoryMaxJobs
+		}
+
 		// Settings Output
 		if config.SettingsOutput {
 			dupeConfig := config
@@ -532,10 +582,10 @@ func loadConfig() error {
 		if (config.Credentials.Token == "" || config.Credentials.Token == placeholderToken) &&
 			(config.Credentials.Email == "" || config.Credentials.Email == placeholderEmail) &&
 			(config.Credentials.Password == "" || config.Credentials.Password == placeholderPassword) {
-			log.Println(lg("Settings", "loadConfig", color.HiRedString, "No valid discord login found. Token, Email, and Password are all invalid..."))
+			log.Println(lg("Settings", "loadConfig", color.HiRedString, "No valid discord login found..."))
 			log.Println(lg("Settings", "loadConfig", color.HiYellowString, "Please save your credentials & info into \"%s\" then restart...", configFile))
-			log.Println(lg("Settings", "loadConfig", color.MagentaString, "If your credentials are already properly saved, please ensure you're following proper JSON format syntax."))
-			log.Println(lg("Settings", "loadConfig", color.MagentaString, "You DO NOT NEED `Token` *AND* `Email`+`Password`, just one OR the other."))
+			log.Println(lg("Settings", "loadConfig", color.MagentaString, "If your credentials are already properly saved, please ensure you're following proper JSON format syntax..."))
+			log.Println(lg("Settings", "loadConfig", color.MagentaString, "You DO NOT NEED token *AND* email/password, just one OR the other."))
 			properExit()
 		}
 
@@ -551,11 +601,13 @@ func loadConfig() error {
 			getBoundUsersCount(), pluralS(getBoundUsersCount()), allString,
 		))
 
+		// SETTINGS TO BE APPLIED IMMEDIATELY
+
 		if config.ProcessLimit > 0 {
 			runtime.GOMAXPROCS(config.ProcessLimit)
 		}
 	}
-	mainWg.Done()
+
 	return nil
 }
 
@@ -768,9 +820,9 @@ func createConfig() {
 			log.Println(lg("Settings", "create", color.HiYellowString,
 				"Please save your credentials & info into \"%s\" then restart...", configFile))
 			log.Println(lg("Settings", "create", color.MagentaString,
-				"You DO NOT NEED `Token` *AND* `Email`+`Password`, just one OR the other."))
+				"You DO NOT NEED token *AND* email/password, just one OR the other."))
 			log.Println(lg("Settings", "create", color.MagentaString,
-				"See README on GitHub for help and more info..."))
+				"THERE ARE MANY HIDDEN SETTINGS AVAILABLE, SEE THE GITHUB README github.com/"+projectRepo))
 		}
 	}
 }
@@ -969,7 +1021,9 @@ func adminChannelDefault(channel *configurationAdminChannel) {
 	}
 }
 
-//#region Channel Checks/Returns
+//#endregion
+
+//#region Functions, Admin & Source
 
 func isNestedMessage(subjectMessage *discordgo.Message, targetChannel string) bool {
 	if subjectMessage.ID != "" {

+ 80 - 75
main.go

@@ -108,10 +108,8 @@ func init() {
 
 func main() {
 
-	mainWg.Add(2)
-	go loadConfig()
-	time.Sleep(1 * time.Second)
-	go openDatabase()
+	loadConfig()
+	openDatabase()
 
 	// Regex
 	mainWg.Add(1)
@@ -502,8 +500,6 @@ func openDatabase() {
 	// Cache download tally
 	cachedDownloadID = dbDownloadCount()
 	log.Println(lg("Database", "", color.HiYellowString, "Database opened, contains %d entries...", cachedDownloadID))
-
-	mainWg.Done()
 }
 
 func botLoad() {
@@ -515,82 +511,86 @@ func botLoad() {
 
 func botLoadAPIs() {
 	// Twitter API
-	if config.Credentials.TwitterAccessToken != "" &&
-		config.Credentials.TwitterAccessTokenSecret != "" &&
-		config.Credentials.TwitterConsumerKey != "" &&
-		config.Credentials.TwitterConsumerSecret != "" {
-
-		log.Println(lg("API", "Twitter", color.MagentaString, "Connecting to API..."))
-
-		twitterLoginCount := 0
-	do_twitter_login:
-		twitterLoginCount++
-		if twitterLoginCount > 1 {
-			time.Sleep(3 * time.Second)
-		}
-		twitterClient = anaconda.NewTwitterApiWithCredentials(
-			config.Credentials.TwitterAccessToken,
-			config.Credentials.TwitterAccessTokenSecret,
-			config.Credentials.TwitterConsumerKey,
-			config.Credentials.TwitterConsumerSecret,
-		)
-		twitterSelf, err := twitterClient.GetSelf(url.Values{})
-		if err != nil {
-			log.Println(lg("API", "Twitter", color.HiRedString, "API Login Error: %s", err.Error()))
-			if twitterLoginCount <= 3 {
-				goto do_twitter_login
-			} else {
-				log.Println(lg("API", "Twitter", color.HiRedString,
-					"Failed to login to Twitter API, the bot will not fetch tweet media..."))
+	go func() {
+		if config.Credentials.TwitterAccessToken != "" &&
+			config.Credentials.TwitterAccessTokenSecret != "" &&
+			config.Credentials.TwitterConsumerKey != "" &&
+			config.Credentials.TwitterConsumerSecret != "" {
+
+			log.Println(lg("API", "Twitter", color.MagentaString, "Connecting to API..."))
+
+			twitterLoginCount := 0
+		do_twitter_login:
+			twitterLoginCount++
+			if twitterLoginCount > 1 {
+				time.Sleep(3 * time.Second)
 			}
+			twitterClient = anaconda.NewTwitterApiWithCredentials(
+				config.Credentials.TwitterAccessToken,
+				config.Credentials.TwitterAccessTokenSecret,
+				config.Credentials.TwitterConsumerKey,
+				config.Credentials.TwitterConsumerSecret,
+			)
+			twitterSelf, err := twitterClient.GetSelf(url.Values{})
+			if err != nil {
+				log.Println(lg("API", "Twitter", color.HiRedString, "API Login Error:\n%s", err.Error()))
+				if twitterLoginCount <= 3 {
+					goto do_twitter_login
+				} else {
+					log.Println(lg("API", "Twitter", color.HiRedString,
+						"Failed to login to Twitter API, the bot will not fetch tweet media..."))
+				}
 
+			} else {
+				log.Println(lg("API", "Twitter", color.HiMagentaString,
+					"Connected to API @%s", twitterSelf.ScreenName))
+				twitterConnected = true
+			}
 		} else {
-			log.Println(lg("API", "Twitter", color.HiMagentaString,
-				"Connected to API @%s", twitterSelf.ScreenName))
-			twitterConnected = true
+			log.Println(lg("API", "Twitter", color.MagentaString,
+				"API credentials missing, the bot won't use the Twitter API."))
 		}
-	} else {
-		log.Println(lg("API", "Twitter", color.MagentaString,
-			"API credentials missing, the bot won't use the Twitter API."))
-	}
+	}()
 
 	// Instagram API
-	if config.Credentials.InstagramUsername != "" &&
-		config.Credentials.InstagramPassword != "" {
-
-		log.Println(lg("API", "Instagram", color.MagentaString, "Connecting to API..."))
-
-		instagramLoginCount := 0
-	do_instagram_login:
-		instagramLoginCount++
-		if instagramLoginCount > 1 {
-			time.Sleep(3 * time.Second)
-		}
-		if instagramClient, err = goinsta.Import(instagramCachePath); err != nil {
-			instagramClient = goinsta.New(config.Credentials.InstagramUsername, config.Credentials.InstagramPassword)
-			if err := instagramClient.Login(); err != nil {
-				log.Println(lg("API", "Instagram", color.HiRedString, "API Login Error: %s", err.Error()))
-				if instagramLoginCount <= 3 {
-					goto do_instagram_login
+	go func() {
+		if config.Credentials.InstagramUsername != "" &&
+			config.Credentials.InstagramPassword != "" {
+
+			log.Println(lg("API", "Instagram", color.MagentaString, "Connecting to API..."))
+
+			instagramLoginCount := 0
+		do_instagram_login:
+			instagramLoginCount++
+			if instagramLoginCount > 1 {
+				time.Sleep(3 * time.Second)
+			}
+			if instagramClient, err = goinsta.Import(instagramCachePath); err != nil {
+				instagramClient = goinsta.New(config.Credentials.InstagramUsername, config.Credentials.InstagramPassword)
+				if err := instagramClient.Login(); err != nil {
+					log.Println(lg("API", "Instagram", color.HiRedString, "API Login Error: %s", err.Error()))
+					if instagramLoginCount <= 3 {
+						goto do_instagram_login
+					} else {
+						log.Println(lg("API", "Instagram", color.HiRedString,
+							"Failed to login to Instagram API, the bot will not fetch instagram media..."))
+					}
 				} else {
-					log.Println(lg("API", "Instagram", color.HiRedString,
-						"Failed to login to Instagram API, the bot will not fetch tweet media..."))
+					log.Println(lg("API", "Instagram", color.HiMagentaString,
+						"Connected to API @%s via new login", instagramClient.Account.Username))
+					instagramConnected = true
+					defer instagramClient.Export(instagramCachePath)
 				}
 			} else {
 				log.Println(lg("API", "Instagram", color.HiMagentaString,
-					"Connected to API @%s via new login", instagramClient.Account.Username))
+					"Connected to API @%s via cache", instagramClient.Account.Username))
 				instagramConnected = true
 			}
 		} else {
-			log.Println(lg("API", "Instagram", color.HiMagentaString,
-				"Connected to API @%s via cache", instagramClient.Account.Username))
-			instagramConnected = true
+			log.Println(lg("API", "Instagram", color.MagentaString,
+				"API credentials missing, the bot won't use the Instagram API."))
 		}
-		defer instagramClient.Export(instagramCachePath)
-	} else {
-		log.Println(lg("API", "Instagram", color.MagentaString,
-			"API credentials missing, the bot won't use the Instagram API."))
-	}
+	}()
 
 	mainWg.Done()
 }
@@ -600,10 +600,12 @@ func botLoadDiscord() {
 
 	// Discord Login
 	connectBot := func() {
+
 		// Event Handlers
 		botCommands = handleCommands()
 		bot.AddHandler(messageCreate)
 		bot.AddHandler(messageUpdate)
+
 		// Connect Bot
 		bot.LogLevel = -1 // to ignore dumb wsapi error
 		err = bot.Open()
@@ -611,6 +613,7 @@ func botLoadDiscord() {
 			log.Println(lg("Discord", "", color.HiRedString, "Discord login failed:\t%s", err))
 			properExit()
 		}
+
 		bot.LogLevel = config.DiscordLogLevel // reset
 		bot.ShouldReconnectOnError = true
 		dur, err := time.ParseDuration(fmt.Sprint(config.DiscordTimeout) + "s")
@@ -618,6 +621,7 @@ func botLoadDiscord() {
 			dur, _ = time.ParseDuration("180s")
 		}
 		bot.Client.Timeout = dur
+
 		bot.State.MaxMessageCount = 100000
 		bot.State.TrackChannels = true
 		bot.State.TrackThreads = true
@@ -712,11 +716,15 @@ do_discord_login:
 		selfbot = bot.State.User.Email != ""
 	}
 
-	// Source Validation
+	// Start Presence
+	timeLastUpdated = time.Now()
+	go updateDiscordPresence()
+
+	//(SV) Source Validation
 	if config.Debug {
 		log.Println(lg("Discord", "Validation", color.HiYellowString, "Validating configured sources..."))
 	}
-	//-
+	//(SV) Check Admin Channels
 	if config.AdminChannels != nil {
 		for _, adminChannel := range config.AdminChannels {
 			if adminChannel.ChannelIDs != nil {
@@ -739,7 +747,7 @@ do_discord_login:
 			}
 		}
 	}
-	//-
+	//(SV) Check Sources
 	for _, server := range config.Servers {
 		if server.ServerIDs != nil {
 			for _, subserver := range *server.ServerIDs {
@@ -799,7 +807,7 @@ do_discord_login:
 			}
 		}
 	}
-	//-
+	//(SV) Output
 	invalidSources := len(invalidAdminChannels) + len(invalidChannels) + len(invalidCategories) + len(invalidServers)
 	if invalidSources > 0 {
 		log.Println(lg("Discord", "Validation", color.HiRedString,
@@ -826,8 +834,5 @@ do_discord_login:
 		log.Println(lg("Discord", "Validation", color.HiGreenString, "All sources successfully validated!"))
 	}
 
-	// Start Presence
-	timeLastUpdated = time.Now()
-	go updateDiscordPresence()
 	mainWg.Done()
 }