mirror of
https://github.com/araxiaonline/wow-item-generator.git
synced 2026-06-13 03:02:22 -04:00
116 lines
3.3 KiB
Go
116 lines
3.3 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"slices"
|
|
|
|
"log"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/araxiaonline/endgame-item-generator/internal/db/mysql"
|
|
"github.com/araxiaonline/endgame-item-generator/internal/items"
|
|
"github.com/joho/godotenv"
|
|
_ "github.com/mattn/go-sqlite3"
|
|
)
|
|
|
|
type EndGameItem struct {
|
|
Entry int `db:"entry"`
|
|
Class int `db:"class"`
|
|
Subclass int `db:"subclass"`
|
|
StatsList string `db:"stats_list"`
|
|
}
|
|
|
|
func createItemsTable(db *sql.DB) {
|
|
createItems := `CREATE TABLE IF NOT EXISTS items (
|
|
entry int unsigned NOT NULL DEFAULT '0',
|
|
class tinyint unsigned NOT NULL DEFAULT '0',
|
|
name varchar(250) NOT NULL DEFAULT '',
|
|
Quality int unsigned NOT NULL DEFAULT '0',
|
|
itemLevel int unsigned NOT NULL DEFAULT '0',
|
|
subclass tinyint unsigned NOT NULL DEFAULT '0',
|
|
stats_list varchar(250) NOT NULL DEFAULT '',
|
|
PRIMARY KEY (entry)
|
|
)`
|
|
|
|
_, err := db.Exec(createItems)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func ConvertIntSliceToString(slice []int) string {
|
|
sliceStr := make([]string, len(slice))
|
|
for i, v := range slice {
|
|
sliceStr[i] = strconv.Itoa(v)
|
|
}
|
|
|
|
return strings.Join(sliceStr, ",")
|
|
}
|
|
|
|
func main() {
|
|
godotenv.Load("../../.env")
|
|
liteDb, err := sql.Open("sqlite3", "../../data/items.db")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
mysqlDb, err := mysql.Connect(&mysql.MySqlConfig{
|
|
Host: os.Getenv("DB_HOST"),
|
|
User: os.Getenv("DB_USER"),
|
|
Password: os.Getenv("DB_PASSWORD"),
|
|
Database: os.Getenv("DB_NAME"),
|
|
})
|
|
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
defer liteDb.Close()
|
|
defer mysqlDb.Close()
|
|
|
|
// create the items table if it doesnt exist
|
|
createItemsTable(liteDb)
|
|
|
|
// create the endgames items lookup table locally for items 200 and above
|
|
var dbItems []mysql.DbItem
|
|
sql := `
|
|
SELECT ` + mysql.GetItemFields("") + `
|
|
from acore_world.item_template
|
|
where ItemLevel >= 220 and Quality >= 3 and ItemLevel < 290
|
|
AND name NOT LIKE 'NPC Equip%' and name NOT LIKE 'OLD%'
|
|
AND name NOT LIKE '%(test)%' AND name NOT LIKE '%Deprecated%'
|
|
AND name NOT LIKE '%Monster - %'
|
|
AND ((class = 2 and subclass IN(0,1,2,3,4,5,6,7,8,10,11,12,13,15,16,17,18,19)) or ((class = 4 AND subclass IN (0,1,2,3,4,6))))
|
|
AND stat_type1 != 32 AND stat_type2 != 32 AND stat_type3 != 32 AND stat_type4 != 32 AND stat_type5 != 32 AND stat_type6 != 32 AND stat_type7 != 32 AND stat_type8 != 32 AND stat_type9 != 32 AND stat_type10 != 32
|
|
`
|
|
err = mysqlDb.Select(&dbItems, sql)
|
|
if err != nil {
|
|
log.Printf("Failed to get items: %v", err)
|
|
}
|
|
|
|
for _, dbItem := range dbItems {
|
|
item := items.ItemFromDbItem(dbItem)
|
|
var statsList []int
|
|
for i := 1; i <= 10; i++ {
|
|
val, _ := item.GetField(fmt.Sprintf("StatValue%v", i))
|
|
statId, _ := item.GetField(fmt.Sprintf("StatType%v", i))
|
|
if val != 0 {
|
|
statsList = append(statsList, statId)
|
|
}
|
|
}
|
|
slices.Sort(statsList)
|
|
statsListStr := ConvertIntSliceToString(statsList)
|
|
log.Printf("StatList %s for Item %v", statsListStr, item.Name)
|
|
_, err = liteDb.Exec("INSERT OR IGNORE INTO items (entry, class, name, Quality, itemLevel, subclass, stats_list) VALUES (?, ?, ?, ?, ?,?,?)", item.Entry, *item.Class, item.Name, *item.Quality, *item.ItemLevel, *item.Subclass, statsListStr)
|
|
if err != nil {
|
|
log.Printf("Failed to insert item %v: %v", item.Entry, err)
|
|
}
|
|
|
|
}
|
|
|
|
log.Printf("Items: %v", len(dbItems))
|
|
}
|