diff --git a/Taskfile.yml b/Taskfile.yml index 6f2562e..17e1e0c 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -84,3 +84,17 @@ tasks: - '{{.BIN}}/cool-down' cmds: - go install ./cmd/cool-down + + install-ic-merge: + desc: Installs the ic-merge command + source: + - go.mod + - go.sum + - cmd/ic-merge/**/*.go + - cli/context/*.go + - cli/err/*.go + - infinitecraft/**/*.go + generates: + - '{{.BIN}}/ic-merge' + cmds: + - go install ./cmd/ic-merge diff --git a/cmd/ic-merge/main.go b/cmd/ic-merge/main.go index 1be90ef..63563b2 100644 --- a/cmd/ic-merge/main.go +++ b/cmd/ic-merge/main.go @@ -2,7 +2,7 @@ package main import ( "context" - "encoding/json" + "fmt" "os" c "codeberg.org/danjones000/utils/cli/context" @@ -26,9 +26,9 @@ func main() { g, err := m.Merge(ctx) e.HandleErr(err) - jsout := json.NewEncoder(os.Stdout) - jsout.SetIndent("", "\t") - err = jsout.Encode(g) + var out string + out, err = m.Write(ctx, g) e.HandleErr(err) - // */ + + fmt.Printf("Saved to %s\n", out) } diff --git a/infinitecraft/game.go b/infinitecraft/game.go index 6a4c729..3cbb883 100644 --- a/infinitecraft/game.go +++ b/infinitecraft/game.go @@ -3,8 +3,8 @@ package infinitecraft type Game struct { Name string `json:"name"` Version string `json:"version"` - Created uint64 `json:"created"` - Updated uint64 `json:"updated"` + Created int64 `json:"created"` + Updated int64 `json:"updated"` Instances []any `json:"instances" db:"-"` Items []Item `json:"items" db:"-"` } diff --git a/infinitecraft/merger.go b/infinitecraft/merger.go index dd70295..36d2ef8 100644 --- a/infinitecraft/merger.go +++ b/infinitecraft/merger.go @@ -139,11 +139,11 @@ func (m *Merger) getGameDetails(ctx context.Context, g *Game) error { return m.db.GetContext(ctx, g, `SELECT name, version FROM games ORDER BY id ASC LIMIT 1`) } -func (m *Merger) getGameCreated(ctx context.Context, date *uint64) error { +func (m *Merger) getGameCreated(ctx context.Context, date *int64) error { return m.db.GetContext(ctx, date, `SELECT MIN(created) FROM games`) } -func (m *Merger) getGameUpdated(ctx context.Context, date *uint64) error { +func (m *Merger) getGameUpdated(ctx context.Context, date *int64) error { return m.db.GetContext(ctx, date, `SELECT MAX(updated) FROM games`) } @@ -221,30 +221,6 @@ func (m *Merger) Merge(ctx context.Context) (g Game, err error) { return } -type GameItem struct { - Game string `db:"game"` - GameID int64 `db:"game_id"` - Text string `db:"name"` - Emoji string - Id int64 `db:"orig_id"` -} - -func (m *Merger) GameItems(ctx context.Context) (gits []GameItem, err error) { - err = m.db.SelectContext(ctx, &gits, ` - SELECT - g.name AS game, - g.id AS game_id, - it.name, - it.emoji, - it.id - 1 AS orig_id - FROM games_items gi - JOIN items it ON gi.item_id = it.id - JOIN games g ON gi.game_id = g.id - ORDER BY gi.id ASC - `) - return -} - func (m *Merger) insertGames(ctx context.Context) (mp map[int64]Game, err error) { mp = make(map[int64]Game, len(m.games)) var res sql.Result diff --git a/infinitecraft/write.go b/infinitecraft/write.go new file mode 100644 index 0000000..07013d0 --- /dev/null +++ b/infinitecraft/write.go @@ -0,0 +1,35 @@ +package infinitecraft + +import ( + "compress/gzip" + "context" + "encoding/json" + "fmt" + "os" + "time" +) + +func (m *Merger) Write(ctx context.Context, g Game) (out string, err error) { + base := fmt.Sprintf("%s - %s", time.Now().Local().Format("2006-01-02T15_04_05"), g.Name) + out = base + ".ic" + + var f *os.File + if f, err = os.Create(out); err != nil { + return + } + defer f.Close() + + gz := gzip.NewWriter(f) + defer gz.Close() + gz.Name = base + gz.ModTime = time.Unix(g.Updated/1000, g.Updated%1000) + gz.Comment = "merge by ic-merge" + + if g.Instances == nil { + g.Instances = make([]any, 0) + } + + enc := json.NewEncoder(gz) + err = enc.Encode(g) + return +}