Support for multiple users using ,
This commit is contained in:
		
							
								
								
									
										147
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								main.go
									
									
									
									
									
								
							@@ -151,7 +151,7 @@ var (
 | 
			
		||||
				{
 | 
			
		||||
					Type:        discordgo.ApplicationCommandOptionString,
 | 
			
		||||
					Name:        "identifier",
 | 
			
		||||
					Description: "Username or UID",
 | 
			
		||||
					Description: "Usernames or UIDs, separated by commas",
 | 
			
		||||
					Required:    true,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@@ -163,7 +163,7 @@ var (
 | 
			
		||||
				{
 | 
			
		||||
					Type:        discordgo.ApplicationCommandOptionString,
 | 
			
		||||
					Name:        "identifier",
 | 
			
		||||
					Description: "Username or UID",
 | 
			
		||||
					Description: "Usernames or UIDs, separated by commas",
 | 
			
		||||
					Required:    true,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@@ -404,10 +404,20 @@ var (
 | 
			
		||||
			reset(userName, softwareType)
 | 
			
		||||
			tableName, _ := getTableNameAndBaseURL(strings.ToLower(softwareType))
 | 
			
		||||
 | 
			
		||||
			_, err = resetAndVerify(tableName, int(userUID))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
			successes, errors := resetAndVerify(tableName, []int{userUID})
 | 
			
		||||
			if len(errors) > 0 {
 | 
			
		||||
				for _, err := range errors {
 | 
			
		||||
					log.Println("Error resetting hwid:", err)
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				for _, success := range successes {
 | 
			
		||||
					if success {
 | 
			
		||||
						log.Printf("Reset successful for UID %d", userUID)
 | 
			
		||||
					} else {
 | 
			
		||||
						log.Printf("Reset unsuccessful for UID %d", userUID)
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			log.Printf("Reset the HWID of user %s with UID %d for %s", userName, userUID, softwareType)
 | 
			
		||||
 | 
			
		||||
			err = client.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
 | 
			
		||||
@@ -480,11 +490,8 @@ var (
 | 
			
		||||
func resetCommandHandler(client *discordgo.Session, i *discordgo.InteractionCreate, softwareType string) {
 | 
			
		||||
	hasAdminPermission := false
 | 
			
		||||
 | 
			
		||||
	var userName string
 | 
			
		||||
	var userUID int
 | 
			
		||||
	var err error
 | 
			
		||||
	var tableName string
 | 
			
		||||
	var baseURL string
 | 
			
		||||
 | 
			
		||||
	for _, roleID := range config.Discord.AdminRoles {
 | 
			
		||||
		member, err := client.GuildMember(i.GuildID, i.Member.User.ID)
 | 
			
		||||
@@ -519,6 +526,16 @@ func resetCommandHandler(client *discordgo.Session, i *discordgo.InteractionCrea
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	identifier := i.ApplicationCommandData().Options[0].StringValue()
 | 
			
		||||
	identifierList := strings.Split(identifier, ",")
 | 
			
		||||
 | 
			
		||||
	var userUIDs []int
 | 
			
		||||
 | 
			
		||||
	for _, identifier := range identifierList {
 | 
			
		||||
		identifier = strings.TrimSpace(identifier)
 | 
			
		||||
 | 
			
		||||
		var userName string
 | 
			
		||||
		var userUID int
 | 
			
		||||
		var err error
 | 
			
		||||
 | 
			
		||||
		if uid, err := strconv.Atoi(identifier); err == nil {
 | 
			
		||||
			userUID = uid
 | 
			
		||||
@@ -527,14 +544,24 @@ func resetCommandHandler(client *discordgo.Session, i *discordgo.InteractionCrea
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if userName != "" {
 | 
			
		||||
		_, baseURL = getTableNameAndBaseURL(softwareType)
 | 
			
		||||
			_, baseURL := getTableNameAndBaseURL(softwareType)
 | 
			
		||||
			userUID, err = fetchUserID(userName, baseURL)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Println("Error fetching user ID:", err)
 | 
			
		||||
			err = client.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if userUID != 0 {
 | 
			
		||||
			userUIDs = append(userUIDs, userUID)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(userUIDs) == 0 {
 | 
			
		||||
		err := client.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
 | 
			
		||||
			Type: discordgo.InteractionResponseChannelMessageWithSource,
 | 
			
		||||
			Data: &discordgo.InteractionResponseData{
 | 
			
		||||
					Content: "Error fetching user ID.",
 | 
			
		||||
				Content: "No valid users found to reset.",
 | 
			
		||||
				Flags:   discordgo.MessageFlagsEphemeral,
 | 
			
		||||
			},
 | 
			
		||||
		})
 | 
			
		||||
@@ -543,31 +570,27 @@ func resetCommandHandler(client *discordgo.Session, i *discordgo.InteractionCrea
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tableName, _ = getTableNameAndBaseURL(softwareType)
 | 
			
		||||
	success, err := resetAndVerify(tableName, userUID)
 | 
			
		||||
	if err != nil || !success {
 | 
			
		||||
		log.Println("Error resetting user:", err)
 | 
			
		||||
		err = client.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
 | 
			
		||||
			Type: discordgo.InteractionResponseChannelMessageWithSource,
 | 
			
		||||
			Data: &discordgo.InteractionResponseData{
 | 
			
		||||
				Content: "Error resetting user.",
 | 
			
		||||
				Flags:   discordgo.MessageFlagsEphemeral,
 | 
			
		||||
			},
 | 
			
		||||
		})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Println("Error sending interaction response:", err)
 | 
			
		||||
	successes, errors := resetAndVerify(tableName, userUIDs)
 | 
			
		||||
	if len(errors) > 0 {
 | 
			
		||||
		for _, err := range errors {
 | 
			
		||||
			log.Println("Error:", err)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		for i, success := range successes {
 | 
			
		||||
			if success {
 | 
			
		||||
				log.Printf("Reset successful for UID %d", userUIDs[i])
 | 
			
		||||
			} else {
 | 
			
		||||
				log.Printf("Reset unsuccessful for UID %d", userUIDs[i])
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Printf("Reset the HWID of user %s with UID %d for %s", userName, userUID, softwareType)
 | 
			
		||||
 | 
			
		||||
	err = client.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
 | 
			
		||||
		Type: discordgo.InteractionResponseChannelMessageWithSource,
 | 
			
		||||
		Data: &discordgo.InteractionResponseData{
 | 
			
		||||
			Content: fmt.Sprintf("Successfully reset %s's HWID.", identifier),
 | 
			
		||||
			Content: fmt.Sprintf("Successfully reset HWID for %d users.", len(userUIDs)),
 | 
			
		||||
			Flags:   discordgo.MessageFlagsEphemeral,
 | 
			
		||||
		},
 | 
			
		||||
	})
 | 
			
		||||
@@ -657,34 +680,70 @@ func resetHWID(tableName string, uids []int) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func resetAndVerify(tableName string, uid int) (bool, error) {
 | 
			
		||||
func resetAndVerify(tableName string, uids []int) ([]bool, []error) {
 | 
			
		||||
	var beforeHashes []string
 | 
			
		||||
	var afterHashes []string
 | 
			
		||||
	var successes []bool
 | 
			
		||||
	var errorsSlice []error
 | 
			
		||||
 | 
			
		||||
	rows, err := db.Query(fmt.Sprintf(`SELECT "UID", MD5(CONCAT("StorageIdentifier", "BootIdentifier")) FROM public.%q WHERE "UID" = ANY($1)`, tableName), pq.Array(uids))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("Error querying database for before hashes: %v", err)
 | 
			
		||||
		return nil, []error{err}
 | 
			
		||||
	}
 | 
			
		||||
	defer rows.Close()
 | 
			
		||||
 | 
			
		||||
	beforeHashesMap := make(map[int]string)
 | 
			
		||||
	for rows.Next() {
 | 
			
		||||
		var uid int
 | 
			
		||||
		var beforeHash string
 | 
			
		||||
	err := db.QueryRow(
 | 
			
		||||
		fmt.Sprintf(`SELECT MD5(CONCAT("StorageIdentifier", "BootIdentifier")) FROM public.%q WHERE "UID" = $1`, tableName),
 | 
			
		||||
		uid,
 | 
			
		||||
	).Scan(&beforeHash)
 | 
			
		||||
		err := rows.Scan(&uid, &beforeHash)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
		if err == sql.ErrNoRows {
 | 
			
		||||
			return false, fmt.Errorf("no rows found for UID %d", uid)
 | 
			
		||||
			log.Printf("Error scanning rows: %v", err)
 | 
			
		||||
			errorsSlice = append(errorsSlice, err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		return false, fmt.Errorf("error querying database: %v", err)
 | 
			
		||||
		beforeHashesMap[uid] = beforeHash
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resetHWID(tableName, []int{uid})
 | 
			
		||||
	for _, uid := range uids {
 | 
			
		||||
		beforeHashes = append(beforeHashes, beforeHashesMap[uid])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resetHWID(tableName, uids)
 | 
			
		||||
 | 
			
		||||
	rows, err = db.Query(fmt.Sprintf(`SELECT "UID", MD5(CONCAT("StorageIdentifier", "BootIdentifier")) FROM public.%q WHERE "UID" = ANY($1)`, tableName), pq.Array(uids))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("Error querying database for after hashes: %v", err)
 | 
			
		||||
		return nil, []error{err}
 | 
			
		||||
	}
 | 
			
		||||
	defer rows.Close()
 | 
			
		||||
 | 
			
		||||
	afterHashesMap := make(map[int]string)
 | 
			
		||||
	for rows.Next() {
 | 
			
		||||
		var uid int
 | 
			
		||||
		var afterHash string
 | 
			
		||||
	err = db.QueryRow(
 | 
			
		||||
		fmt.Sprintf(`SELECT MD5(CONCAT("StorageIdentifier", "BootIdentifier")) FROM public.%q WHERE "UID" = $1`, tableName),
 | 
			
		||||
		uid,
 | 
			
		||||
	).Scan(&afterHash)
 | 
			
		||||
		err := rows.Scan(&uid, &afterHash)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
		if err == sql.ErrNoRows {
 | 
			
		||||
			return false, fmt.Errorf("no rows found for UID %d after reset", uid)
 | 
			
		||||
			log.Printf("Error scanning rows: %v", err)
 | 
			
		||||
			errorsSlice = append(errorsSlice, err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		return false, fmt.Errorf("error querying database after reset: %v", err)
 | 
			
		||||
		afterHashesMap[uid] = afterHash
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return beforeHash != afterHash || afterHash == "d41d8cd98f00b204e9800998ecf8427e", nil
 | 
			
		||||
	for _, uid := range uids {
 | 
			
		||||
		afterHash, ok := afterHashesMap[uid]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			errorsSlice = append(errorsSlice, fmt.Errorf("no rows found for UID %d after reset", uid))
 | 
			
		||||
			successes = append(successes, false)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		afterHashes = append(afterHashes, afterHash)
 | 
			
		||||
		successes = append(successes, beforeHashesMap[uid] != afterHash || afterHash == "d41d8cd98f00b204e9800998ecf8427e")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return successes, errorsSlice
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user