PiZzA
All checks were successful
Docker Deploy / build-and-push (push) Successful in 3m23s

This commit is contained in:
2026-01-27 13:52:57 -07:00
parent 9694a42f3f
commit 221c5cec97
9 changed files with 348 additions and 5 deletions

View File

@@ -24,12 +24,13 @@ func ProcessHimbucks(s *discordgo.Session, m *discordgo.MessageCreate, ctx *Proc
// Get current state
var messageCount int
var lastRewardAt sql.NullTime
var multiplier float64
err = tx.QueryRow(`
SELECT message_count, last_reward_at
SELECT message_count, last_reward_at, COALESCE(multiplier, 1.0)
FROM guild_profiles
WHERE user_id = ? AND guild_id = ?`,
ctx.UserID, ctx.GuildID).Scan(&messageCount, &lastRewardAt)
ctx.UserID, ctx.GuildID).Scan(&messageCount, &lastRewardAt, &multiplier)
if err != nil {
return fmt.Errorf("failed to get message count: %w", err)
}
@@ -39,13 +40,14 @@ func ProcessHimbucks(s *discordgo.Session, m *discordgo.MessageCreate, ctx *Proc
(!lastRewardAt.Valid || time.Since(lastRewardAt.Time) >= AppConfig.CooldownPeriod)
if shouldReward {
reward := int(float64(AppConfig.HimbucksPerReward) * multiplier)
_, err = tx.Exec(`
UPDATE guild_profiles
SET currency_balance = currency_balance + ?,
message_count = 0,
last_reward_at = CURRENT_TIMESTAMP
WHERE user_id = ? AND guild_id = ?`,
AppConfig.HimbucksPerReward, ctx.UserID, ctx.GuildID)
reward, ctx.UserID, ctx.GuildID)
} else {
_, err = tx.Exec(`
UPDATE guild_profiles
@@ -179,3 +181,138 @@ func GetLeaderboard(guildID string, limit int) ([]HimbucksEntry, error) {
}
return entries, nil
}
func BuyMultiplier(discordID, guildID string) (float64, int, int, error) {
tx, err := DBClient.Begin()
if err != nil {
return 0, 0, 0, fmt.Errorf("failed to start transaction: %w", err)
}
defer tx.Rollback()
var userID int
err = tx.QueryRow("SELECT id FROM users WHERE discord_id = ?", discordID).Scan(&userID)
if err != nil {
return 0, 0, 0, fmt.Errorf("user not found: %w", err)
}
var balance int
var currentMultiplier float64
err = tx.QueryRow(`
SELECT currency_balance, COALESCE(multiplier, 1.0)
FROM guild_profiles
WHERE user_id = ? AND guild_id = ?`,
userID, guildID).Scan(&balance, &currentMultiplier)
if err != nil {
return 0, 0, 0, fmt.Errorf("failed to get profile: %w", err)
}
cost := int(1000 * currentMultiplier)
if balance < cost {
return 0, 0, 0, fmt.Errorf("insufficient funds: have %d, need %d", balance, cost)
}
newBalance := balance - cost
newMultiplier := currentMultiplier + 0.5
_, err = tx.Exec(`
UPDATE guild_profiles
SET currency_balance = ?,
multiplier = ?
WHERE user_id = ? AND guild_id = ?`,
newBalance, newMultiplier, userID, guildID)
if err != nil {
return 0, 0, 0, fmt.Errorf("failed to update profile: %w", err)
}
if err = tx.Commit(); err != nil {
return 0, 0, 0, fmt.Errorf("failed to commit: %w", err)
}
return newMultiplier, cost, newBalance, nil
}
func BuyPizza(discordID, guildID string) (int, int, error) {
tx, err := DBClient.Begin()
if err != nil {
return 0, 0, fmt.Errorf("failed to start transaction: %w", err)
}
defer tx.Rollback()
var userID int
err = tx.QueryRow("SELECT id FROM users WHERE discord_id = ?", discordID).Scan(&userID)
if err != nil {
return 0, 0, fmt.Errorf("user not found: %w", err)
}
var balance int
err = tx.QueryRow(`
SELECT currency_balance
FROM guild_profiles
WHERE user_id = ? AND guild_id = ?`,
userID, guildID).Scan(&balance)
if err != nil {
return 0, 0, fmt.Errorf("failed to get profile: %w", err)
}
cost := 100
if balance < cost {
return 0, 0, fmt.Errorf("insufficient funds: have %d, need %d", balance, cost)
}
newBalance := balance - cost
_, err = tx.Exec(`
UPDATE guild_profiles
SET currency_balance = ?
WHERE user_id = ? AND guild_id = ?`,
newBalance, userID, guildID)
if err != nil {
return 0, 0, fmt.Errorf("failed to update balance: %w", err)
}
if err = tx.Commit(); err != nil {
return 0, 0, fmt.Errorf("failed to commit transaction: %w", err)
}
return cost, newBalance, nil
}
func GiveHimbucks(discordID, guildID string, amount int) error {
tx, err := DBClient.Begin()
if err != nil {
return fmt.Errorf("failed to start transaction: %w", err)
}
defer tx.Rollback()
var userID int
// Get user ID
err = tx.QueryRow("SELECT id FROM users WHERE discord_id = ?", discordID).Scan(&userID)
if err != nil {
return fmt.Errorf("user not found: %w", err)
}
result, err := tx.Exec(`
UPDATE guild_profiles
SET currency_balance = currency_balance + ?
WHERE user_id = ? AND guild_id = ?`,
amount, userID, guildID)
if err != nil {
return fmt.Errorf("failed to update balance: %w", err)
}
rows, err := result.RowsAffected()
if err != nil {
return fmt.Errorf("failed to check rows affected: %w", err)
}
if rows == 0 {
_, err = tx.Exec(`
INSERT INTO guild_profiles (user_id, guild_id, currency_balance, message_count)
VALUES (?, ?, ?, 0)`,
userID, guildID, amount)
if err != nil {
return fmt.Errorf("failed to create profile: %w", err)
}
}
return tx.Commit()
}