浏览代码

history db and cache wiping

Drn 2 年之前
父节点
当前提交
d61d7edf19
共有 3 个文件被更改,包括 155 次插入69 次删除
  1. 109 33
      commands.go
  2. 10 0
      database.go
  3. 36 36
      main.go

+ 109 - 33
commands.go

@@ -191,10 +191,13 @@ func handleCommands() *exrouter.Route {
 	go router.On("history", func(ctx *exrouter.Context) {
 		if isCommandableChannel(ctx.Msg) {
 			// Vars
+			var all = false
 			var channels []string
 
 			var shouldAbort bool = false
 			var shouldProcess bool = true
+			var shouldWipeDB bool = false
+			var shouldWipeCache bool = false
 
 			var before string
 			var beforeID string
@@ -209,6 +212,14 @@ func handleCommands() *exrouter.Route {
 				if strings.Contains(strings.ToLower(argValue), "cancel") ||
 					strings.Contains(strings.ToLower(argValue), "stop") {
 					shouldAbort = true
+				} else if strings.Contains(strings.ToLower(argValue), "dbwipe") ||
+					strings.Contains(strings.ToLower(argValue), "wipedb") {
+					shouldProcess = false
+					shouldWipeDB = true
+				} else if strings.Contains(strings.ToLower(argValue), "cachewipe") ||
+					strings.Contains(strings.ToLower(argValue), "wipecache") {
+					shouldProcess = false
+					shouldWipeCache = true
 				} else if strings.Contains(strings.ToLower(argValue), "help") ||
 					strings.Contains(strings.ToLower(argValue), "info") {
 					shouldProcess = false
@@ -308,47 +319,48 @@ func handleCommands() *exrouter.Route {
 							}
 						} else if strings.Contains(strings.ToLower(target), "all") {
 							channels = getAllRegisteredChannels()
+							all = true
 						}
 					}
 				}
 			}
 			//#endregion
 
-			//#region Process Channels
-			if shouldProcess {
-				// Local
-				if len(channels) == 0 {
-					channels = append(channels, ctx.Msg.ChannelID)
+			// Local
+			if len(channels) == 0 {
+				channels = append(channels, ctx.Msg.ChannelID)
+			}
+			// Foreach Channel
+			for _, channel := range channels {
+				//#region Process Channels
+				if shouldProcess && config.Debug {
+					nameGuild := channel
+					if chinfo, err := bot.State.Channel(channel); err == nil {
+						nameGuild = getGuildName(chinfo.GuildID)
+					}
+					nameCategory := getChannelCategoryName(channel)
+					nameChannel := getChannelName(channel)
+					nameDisplay := fmt.Sprintf("%s / %s", nameGuild, nameChannel)
+					if nameCategory != "unknown" {
+						nameDisplay = fmt.Sprintf("%s / %s / %s", nameGuild, nameCategory, nameChannel)
+					}
+					log.Println(lg("Command", "History", color.HiMagentaString,
+						"Queueing history job for \"%s\"\t\t(%s) ...", nameDisplay, channel))
 				}
-				// Foreach Channel
-				for _, channel := range channels {
-					if config.Debug {
-						nameGuild := channel
-						if chinfo, err := bot.State.Channel(channel); err == nil {
-							nameGuild = getGuildName(chinfo.GuildID)
-						}
-						nameCategory := getChannelCategoryName(channel)
-						nameChannel := getChannelName(channel)
-						nameDisplay := fmt.Sprintf("%s / %s", nameGuild, nameChannel)
-						if nameCategory != "unknown" {
-							nameDisplay = fmt.Sprintf("%s / %s / %s", nameGuild, nameCategory, nameChannel)
+				if !isBotAdmin(ctx.Msg) {
+					log.Println(lg("Command", "History", color.CyanString,
+						"%s tried to handle history for %s but lacked proper permission.",
+						getUserIdentifier(*ctx.Msg.Author), channel))
+					if !hasPerms(ctx.Msg.ChannelID, discordgo.PermissionSendMessages) {
+						log.Println(lg("Command", "History", color.HiRedString, fmtBotSendPerm, channel))
+					} else {
+						if _, err := replyEmbed(ctx.Msg, "Command — History", cmderrLackingBotAdminPerms); err != nil {
+							log.Println(lg("Command", "History", color.HiRedString, cmderrSendFailure,
+								getUserIdentifier(*ctx.Msg.Author), err))
 						}
-						log.Println(lg("Command", "History", color.HiMagentaString,
-							"Queueing history job for \"%s\"\t\t(%s) ...", nameDisplay, channel))
 					}
-					if !isBotAdmin(ctx.Msg) {
-						log.Println(lg("Command", "History", color.CyanString,
-							"%s tried to cache history for %s but lacked proper permission.",
-							getUserIdentifier(*ctx.Msg.Author), channel))
-						if !hasPerms(ctx.Msg.ChannelID, discordgo.PermissionSendMessages) {
-							log.Println(lg("Command", "History", color.HiRedString, fmtBotSendPerm, channel))
-						} else {
-							if _, err := replyEmbed(ctx.Msg, "Command — History", cmderrLackingBotAdminPerms); err != nil {
-								log.Println(lg("Command", "History", color.HiRedString, cmderrSendFailure,
-									getUserIdentifier(*ctx.Msg.Author), err))
-							}
-						}
-					} else {
+				} else {
+					if shouldProcess {
 						// Run
 						if !shouldAbort {
 							if job, exists := historyJobs[channel]; !exists ||
@@ -386,9 +398,73 @@ func handleCommands() *exrouter.Route {
 								getUserIdentifier(*ctx.Msg.Author), channel))
 						}
 					}
+					if shouldWipeDB {
+						if all {
+							myDB.Close()
+							time.Sleep(1 * time.Second)
+							if _, err := os.Stat(databasePath); err == nil {
+								err = os.RemoveAll(databasePath)
+								if err != nil {
+									log.Println(lg("Command", "History", color.HiRedString,
+										"Encountered error deleting database folder:\t%s", err))
+								} else {
+									log.Println(lg("Command", "History", color.HiGreenString,
+										"Deleted database."))
+								}
+								time.Sleep(1 * time.Second)
+								openDatabase()
+								break
+							} else {
+								log.Println(lg("Command", "History", color.HiRedString,
+									"Database folder inaccessible:\t%s", err))
+							}
+						} else {
+							dbDeleteByChannelID(channel)
+						}
+					}
+					if shouldWipeCache {
+						if all {
+							if _, err := os.Stat(historyCachePath); err == nil {
+								err = os.RemoveAll(historyCachePath)
+								if err != nil {
+									log.Println(lg("Command", "History", color.HiRedString,
+										"Encountered error deleting database folder:\t%s", err))
+								} else {
+									log.Println(lg("Command", "History", color.HiGreenString,
+										"Deleted database."))
+									break
+								}
+							} else {
+								log.Println(lg("Command", "History", color.HiRedString,
+									"Cache folder inaccessible:\t%s", err))
+							}
+						} else {
+							deleteHistoryCache := func(dirpath string) {
+								fp := dirpath + string(os.PathSeparator) + channel
+								if _, err := os.Stat(fp); err == nil {
+									err = os.RemoveAll(fp)
+									if err != nil {
+										log.Println(lg("Debug", "History", color.HiRedString,
+											"Encountered error deleting cache file for %s:\t%s", channel, err))
+									} else {
+										log.Println(lg("Debug", "History", color.HiGreenString,
+											"Deleted cache file for %s.", channel))
+									}
+								} else {
+									log.Println(lg("Command", "History", color.HiRedString,
+										"Cache folder inaccessible:\t%s", err))
+								}
+							}
+							deleteHistoryCache(historyCacheBefore)
+							deleteHistoryCache(historyCacheSince)
+						}
+					}
 				}
+				//#endregion
+			}
+			if shouldWipeDB {
+				cachedDownloadID = dbDownloadCount()
 			}
-			//#endregion
 		}
 	}).Cat("Admin").Alias("catalog", "cache").Desc("Catalogs history for this channel")
 

+ 10 - 0
database.go

@@ -76,6 +76,16 @@ func dbFindDownloadByURL(inputURL string) []*downloadItem {
 	return downloadedImages
 }
 
+func dbDeleteByChannelID(channelID string) {
+	var query interface{}
+	json.Unmarshal([]byte(fmt.Sprintf(`[{"eq": "%s", "in": ["ChannelID"]}]`, channelID)), &query)
+	queryResult := make(map[int]struct{})
+	db.EvalQuery(query, myDB.Use("Downloads"), &queryResult)
+	for id := range queryResult {
+		myDB.Use("Downloads").Delete(id)
+	}
+}
+
 //#region Statistics
 
 func dbDownloadCount() int {

+ 36 - 36
main.go

@@ -120,42 +120,7 @@ func main() {
 	))
 	//#endregion
 
-	//#region Database Initialization
-
-	// Database
-	log.Println(lg("Database", "", color.YellowString, "Opening database..."))
-	myDB, err = db.OpenDB(databasePath)
-	if err != nil {
-		log.Println(lg("Database", "", color.HiRedString, "Unable to open database: %s", err))
-		return
-	}
-	if myDB.Use("Downloads") == nil {
-		log.Println(lg("Database", "Setup", color.YellowString, "Creating database, please wait..."))
-		if err := myDB.Create("Downloads"); err != nil {
-			log.Println(lg("Database", "Setup", color.HiRedString, "Error while trying to create database: %s", err))
-			return
-		}
-		log.Println(lg("Database", "Setup", color.HiYellowString, "Created new database..."))
-		log.Println(lg("Database", "Setup", color.YellowString, "Indexing database, please wait..."))
-		if err := myDB.Use("Downloads").Index([]string{"URL"}); err != nil {
-			log.Println(lg("Database", "Setup", color.HiRedString, "Unable to create database index for URL: %s", err))
-			return
-		}
-		if err := myDB.Use("Downloads").Index([]string{"ChannelID"}); err != nil {
-			log.Println(lg("Database", "Setup", color.HiRedString, "Unable to create database index for ChannelID: %s", err))
-			return
-		}
-		if err := myDB.Use("Downloads").Index([]string{"UserID"}); err != nil {
-			log.Println(lg("Database", "Setup", color.HiRedString, "Unable to create database index for UserID: %s", err))
-			return
-		}
-		log.Println(lg("Database", "Setup", color.HiYellowString, "Created new indexes..."))
-	}
-	// Cache download tally
-	cachedDownloadID = dbDownloadCount()
-	log.Println(lg("Database", "", color.HiYellowString, "Database opened, contains %d entries...", cachedDownloadID))
-
-	//#endregion
+	go openDatabase()
 
 	//#region Component Initialization
 
@@ -450,6 +415,41 @@ func main() {
 	//#endregion
 }
 
+func openDatabase() {
+	// Database
+	log.Println(lg("Database", "", color.YellowString, "Opening database..."))
+	myDB, err = db.OpenDB(databasePath)
+	if err != nil {
+		log.Println(lg("Database", "", color.HiRedString, "Unable to open database: %s", err))
+		return
+	}
+	if myDB.Use("Downloads") == nil {
+		log.Println(lg("Database", "Setup", color.YellowString, "Creating database, please wait..."))
+		if err := myDB.Create("Downloads"); err != nil {
+			log.Println(lg("Database", "Setup", color.HiRedString, "Error while trying to create database: %s", err))
+			return
+		}
+		log.Println(lg("Database", "Setup", color.HiYellowString, "Created new database..."))
+		log.Println(lg("Database", "Setup", color.YellowString, "Indexing database, please wait..."))
+		if err := myDB.Use("Downloads").Index([]string{"URL"}); err != nil {
+			log.Println(lg("Database", "Setup", color.HiRedString, "Unable to create database index for URL: %s", err))
+			return
+		}
+		if err := myDB.Use("Downloads").Index([]string{"ChannelID"}); err != nil {
+			log.Println(lg("Database", "Setup", color.HiRedString, "Unable to create database index for ChannelID: %s", err))
+			return
+		}
+		if err := myDB.Use("Downloads").Index([]string{"UserID"}); err != nil {
+			log.Println(lg("Database", "Setup", color.HiRedString, "Unable to create database index for UserID: %s", err))
+			return
+		}
+		log.Println(lg("Database", "Setup", color.HiYellowString, "Created new indexes..."))
+	}
+	// Cache download tally
+	cachedDownloadID = dbDownloadCount()
+	log.Println(lg("Database", "", color.HiYellowString, "Database opened, contains %d entries...", cachedDownloadID))
+}
+
 func botLoad() {
 	botLoadAPIs()
 	botLoadDiscord()