Compare commits
64 Commits
e1e2445194
...
master
Author | SHA1 | Date |
---|---|---|
JoYo | a5b4585a44 | |
JoYo | 25dd9f17b0 | |
JoYo | ef348159c7 | |
JoYo | 6f2a9ccf06 | |
JoYo | d25d6d1f78 | |
JoYo | 4acfe44e7c | |
JoYo | 619d9fcea2 | |
JoYo | 0ef489faa7 | |
JoYo | f5ff1fdbce | |
JoYo | 35b9852487 | |
JoYo | cf5443ca40 | |
JoYo | 8c9c5d732d | |
JoYo | 62308eed08 | |
JoYo | 8cbd7b31fc | |
JoYo | da8e7ef375 | |
JoYo | b66d606920 | |
JoYo | 68ad8fe0dd | |
JoYo | a2825684f7 | |
JoYo | c9ff88e45f | |
JoYo | 4568309d83 | |
JoYo | 58c30996cd | |
JoYo | 86c75e60f4 | |
JoYo | c860ad42bd | |
JoYo | 62d9433bb0 | |
JoYo | 330c416071 | |
JoYo | d6aef160af | |
JoYo | 773d17346b | |
JoYo | 30228ec14f | |
JoYo | df5e66aab1 | |
JoYo | d8ef990292 | |
JoYo | 4841d68816 | |
JoYo | 2668573716 | |
JoYo | 44a0046211 | |
JoYo | 766275c40d | |
JoYo | 94774b3f26 | |
JoYo | e496d7d52b | |
JoYo | 205025e7ba | |
JoYo | c0b488ea94 | |
JoYo | 56c18d5048 | |
JoYo | b9d0b58b4e | |
JoYo | 23967a8ee7 | |
JoYo | 5c0494be70 | |
JoYo | 9f8da90c64 | |
JoYo | 79f1145098 | |
JoYo | d19f1c9eaa | |
JoYo | 8571b71298 | |
JoYo | 4d81453236 | |
JoYo | db3806e78f | |
JoYo | be36bdf213 | |
JoYo | ca76d4c605 | |
JoYo | 432f4128c9 | |
JoYo | 435230aa6e | |
JoYo | 21bbc6c6b2 | |
JoYo | a5daac007d | |
JoYo | 368413bb51 | |
JoYo | f43fb6c80c | |
JoYo | e491ce5319 | |
JoYo | 6e64eadc27 | |
JoYo | 1884f8df7b | |
JoYo | 9b61c1b3c7 | |
JoYo | fa927f40b8 | |
JoYo | 843ade66ac | |
JoYo | c937dae3b4 | |
JoYo | 30cfbd2157 |
|
@ -0,0 +1,6 @@
|
||||||
|
*.elf
|
||||||
|
*.exe
|
||||||
|
*.sum
|
||||||
|
live/
|
||||||
|
*.list
|
||||||
|
*.zip
|
|
@ -0,0 +1,28 @@
|
||||||
|
EXEs=banana.elf banana.exe
|
||||||
|
|
||||||
|
all: tidy clean ${EXEs}
|
||||||
|
|
||||||
|
tidy:
|
||||||
|
go mod tidy
|
||||||
|
|
||||||
|
banana.elf:
|
||||||
|
go build -o banana.elf banana.go
|
||||||
|
|
||||||
|
banana.exe:
|
||||||
|
GOOS=windows go build -o banana.exe banana.go
|
||||||
|
|
||||||
|
clean:
|
||||||
|
go clean
|
||||||
|
-rm ${EXEs}
|
||||||
|
|
||||||
|
run:
|
||||||
|
go run banana.go -i live/addons.list -o live/AddOns/
|
||||||
|
|
||||||
|
install:
|
||||||
|
GOBIN=~/.local/bin/ go install banana.go
|
||||||
|
|
||||||
|
install-steamos: banana.elf
|
||||||
|
cp banana.elf /usr/bin/banana
|
||||||
|
cp banana.timer banana.service /etc/systemd/system/
|
||||||
|
systemctl enable banana.timer
|
||||||
|
systemctl enable banana.service
|
140
README.mdown
140
README.mdown
|
@ -1,9 +1,143 @@
|
||||||
# Elder Scrolls Online Commadline Addon Manager
|
# Elder Scrolls Online Commadline Addon Manager
|
||||||
|
|
||||||
Elder Scrolls Online addon manager and a Tamriel Trade Centre price table updater
|
Elder Scrolls Online addon manager and a Tamriel Trade Centre price table updater.
|
||||||
|
|
||||||
# Dependencies
|
[MIT License](LICENSE)
|
||||||
|
|
||||||
# Installation
|
It is recommended that you back up your ESO live profile before using `banana` in case you want to revert back.
|
||||||
|
|
||||||
|
On Windows, press `Windows Key + e` to open a file explorer and enter the following path in the address bar:
|
||||||
|
|
||||||
|
```
|
||||||
|
%HOME%\Documents\Elder Scrolls Online\
|
||||||
|
```
|
||||||
|
|
||||||
|
or on Windows 11
|
||||||
|
|
||||||
|
```
|
||||||
|
Documents\Elder Scrolls Online\
|
||||||
|
```
|
||||||
|
|
||||||
|
Make a copy of the `live` folder and rename it to something meaningful like `old` or `backup`.
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
|
|
||||||
|
Follow the installation instructions for your `platform`:
|
||||||
|
|
||||||
|
- [Windows](#windows-installation)
|
||||||
|
- [SteamOS](#steamos-installation)
|
||||||
|
|
||||||
|
On first run, the `addons.list` file will be created in your ESO live directory.
|
||||||
|
It will look similar to the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://www.esoui.com/downloads/info7-LibAddonMenu.html
|
||||||
|
https://www.esoui.com/downloads/info1245-TamrielTradeCentre.html
|
||||||
|
https://www.esoui.com/downloads/info1146-LibCustomMenu.html
|
||||||
|
```
|
||||||
|
|
||||||
|
Add the ESOUI url for each additional addon you wish to keep updated.
|
||||||
|
Make sure to include the `www.` indicator that ESOUI requires for some stupid reason.
|
||||||
|
|
||||||
|
# Windows Installation
|
||||||
|
|
||||||
|
0. Download the latest `banana.exe` release for [Windows](https://git.joyo.dev/eso/banana/releases/).
|
||||||
|
|
||||||
|
1. Add the executable to the [user's path](https://www.wikihow.com/Change-the-PATH-Environment-Variable-on-Windows) or replace "banana.exe" with the full path to where the executable is stored.
|
||||||
|
|
||||||
|
2. Run the executable from the commandline `banana.exe` for a default AddOn update or with `banana.exe -h` for usage.
|
||||||
|
|
||||||
|
# Windows Optional
|
||||||
|
|
||||||
|
To schedule a periodic background run of `banana`, open Powershell as a user and enter the following commands.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$Command = (Get-Command "banana.exe").Source
|
||||||
|
$Action = New-ScheduledTaskAction -Execute $Command -Argument "--log"
|
||||||
|
$Trigger = New-ScheduledTaskTrigger -Daily -At 11am
|
||||||
|
$Settings = New-ScheduledTaskSettingsSet -RunOnlyIfNetworkAvailable -StartWhenAvailable -RunOnlyIfIdle
|
||||||
|
Register-ScheduledTask -TaskName "eso-banana" -Action $Action -Trigger $Trigger -Settings $Settings -Description "Elder Scrolls Online addon manager and a Tamriel Trade Centre price table updater."
|
||||||
|
```
|
||||||
|
|
||||||
|
To check to make sure the task is registered correctly, enter `Get-ScheduledTask` and check that the first entry looks similar:
|
||||||
|
|
||||||
|
```
|
||||||
|
TaskPath TaskName State
|
||||||
|
-------- -------- -----
|
||||||
|
\ eso-banana Ready
|
||||||
|
```
|
||||||
|
|
||||||
|
## Windows Unschedule
|
||||||
|
|
||||||
|
Only run the following command if you wish to remove scheduled run of `eso-banana`.
|
||||||
|
|
||||||
|
To remove the schedule, use the `Unregister-ScheduledTask` command:
|
||||||
|
|
||||||
|
```
|
||||||
|
Unregister-ScheduledTask eso-banana
|
||||||
|
```
|
||||||
|
|
||||||
|
Press enter to confirm removal.
|
||||||
|
|
||||||
|
# SteamOS Installation
|
||||||
|
|
||||||
|
The following instructions are for arch linux system installed with the Steam Deck.
|
||||||
|
|
||||||
|
0. From the [Steam Deck instructions](https://help.steampowered.com/en/faqs/view/671A-4453-E8D2-323C):
|
||||||
|
|
||||||
|
> From the STEAM menu, select Power, then Switch to Desktop
|
||||||
|
|
||||||
|
1. Download the latest `banana.elf` release for [SteamOS](https://git.joyo.dev/eso/banana/releases/).
|
||||||
|
|
||||||
|
2. Set executable with `chmod +x banana.elf` and add the executable to `~/.local/bin/` or any directory in the user's $PATH environment.
|
||||||
|
|
||||||
|
- optionally replace "banana.elf" with the full path to where the executable is stored.
|
||||||
|
|
||||||
|
2. Run the executable from the commandline `banana.elf` for a default AddOn update or with `banana.elf -h` for usage.
|
||||||
|
|
||||||
|
Note: banana will create and `addons.list` file which can be edited to include additional adddon URLs at the following path:
|
||||||
|
|
||||||
|
`$EDITOR "~/.steam/steam/steamapps/compatdata/306130/pfx/drive_c/users/steamuser/Documents/Elder Scrolls Online/live/addons.list"`
|
||||||
|
|
||||||
|
5. To return to [Gaming Mode](https://help.steampowered.com/en/faqs/view/671A-4453-E8D2-323C):
|
||||||
|
|
||||||
|
> ...there's a shortcut link to 'Return to Gaming Mode'.
|
||||||
|
> Select that to get back to standard Steam Deck UI.
|
||||||
|
> You can also go through the system menus to Log Off to get back.
|
||||||
|
|
||||||
|
# SteamOS Optional
|
||||||
|
|
||||||
|
Because systemd is cancer you will need to edit the `banana.service` file to include your user's home path.
|
||||||
|
If `banana` is not installed to `~/.local/bin/banana.elf`, open a new terminal and use the results from `which banana.elf`.
|
||||||
|
|
||||||
|
```
|
||||||
|
[Unit]
|
||||||
|
Description="Elder Scrolls Online addon manager and a Tamriel Trade Centre price table updater."
|
||||||
|
Wants=banana.timer
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/home/<user_name_here>/.local/bin/banana.elf
|
||||||
|
User=deck
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally, install the systemd timer and service to run `banana` everyday.
|
||||||
|
|
||||||
|
```
|
||||||
|
cd ./banana/
|
||||||
|
cp banana.timer banana.service /etc/systemd/system/
|
||||||
|
sudo systemctl enable banana.timer
|
||||||
|
sudo systemctl enable banana.service
|
||||||
|
```
|
||||||
|
|
||||||
|
## SteamOS Unschedule
|
||||||
|
|
||||||
|
Only run the following command if you wish to remove scheduled run of `banana`.
|
||||||
|
|
||||||
|
```
|
||||||
|
systemctl list-timers --all
|
||||||
|
sudo systemctl disable banana.timer
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,367 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/alexflint/go-arg"
|
||||||
|
|
||||||
|
"archive/zip"
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var args struct {
|
||||||
|
Addon_list_path string `arg:"-i,--addon-list" help:"path to addon list file"`
|
||||||
|
Out_dir string `arg:"-o,--live-dir" help:"path to eso live directory"`
|
||||||
|
Ttc bool `arg:"-t,--ttc" help:"only update tamriel trade centre db"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
arg.MustParse(&args)
|
||||||
|
eso_live_path := eso_live_path_get()
|
||||||
|
if args.Addon_list_path == "" {
|
||||||
|
args.Addon_list_path = filepath.Join(eso_live_path, "addons.list")
|
||||||
|
}
|
||||||
|
if args.Out_dir == "" {
|
||||||
|
args.Out_dir = filepath.Join(eso_live_path, "AddOns")
|
||||||
|
}
|
||||||
|
fmt.Println("args", args)
|
||||||
|
|
||||||
|
_, error := os.Stat(args.Addon_list_path)
|
||||||
|
if errors.Is(error, os.ErrNotExist) {
|
||||||
|
error = addon_list_create(args.Addon_list_path)
|
||||||
|
if error != nil {
|
||||||
|
panic(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addon_urls, error := addon_list_read(args.Addon_list_path)
|
||||||
|
if error != nil {
|
||||||
|
panic(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
error = ttc_update(filepath.Join(args.Out_dir, "TamrielTradeCentre"))
|
||||||
|
if error != nil {
|
||||||
|
panic(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Updated,", TCC_PRICE_TABLE_URI)
|
||||||
|
|
||||||
|
if args.Ttc {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
addon_paths, error := os.ReadDir(args.Out_dir)
|
||||||
|
if error != nil {
|
||||||
|
panic(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
var eso_live_addon_names []string
|
||||||
|
for _, path := range addon_paths {
|
||||||
|
if path.IsDir() {
|
||||||
|
eso_live_addon_names = append(eso_live_addon_names, path.Name())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var eso_ui_list []EsoAddon
|
||||||
|
for _, url := range addon_urls {
|
||||||
|
eso_ui, error := eso_ui_stat_init(url)
|
||||||
|
if error != nil {
|
||||||
|
panic(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
eso_ui_list = append(eso_ui_list, eso_ui)
|
||||||
|
}
|
||||||
|
|
||||||
|
var eso_live_list []EsoAddon
|
||||||
|
for _, eso_live_name := range eso_live_addon_names {
|
||||||
|
eso_live, error := eso_live_stat_init(eso_live_name)
|
||||||
|
if error != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
matching := ""
|
||||||
|
|
||||||
|
for _, eso_ui := range eso_ui_list {
|
||||||
|
if strings.Contains(eso_live_name, eso_ui.name) {
|
||||||
|
matching = eso_live_name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if matching == "" {
|
||||||
|
fmt.Println("Removed,", eso_live.path)
|
||||||
|
os.RemoveAll(eso_live.path)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
eso_live_list = append(eso_live_list, eso_live)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, eso_live := range eso_live_list {
|
||||||
|
fmt.Printf("Live, %s, %s\n", eso_live.name, eso_live.version)
|
||||||
|
}
|
||||||
|
for _, eso_ui := range eso_ui_list {
|
||||||
|
fmt.Printf("Updated, %s, %s\n", eso_ui.name, eso_ui.version)
|
||||||
|
error = eso_ui_get_unzip(eso_ui.path, args.Out_dir)
|
||||||
|
if error != nil {
|
||||||
|
panic(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
CONFIG_TEMPLATE = `https://www.esoui.com/downloads/info7-LibAddonMenu.html
|
||||||
|
https://www.esoui.com/downloads/info1245-TamrielTradeCentre.html
|
||||||
|
https://www.esoui.com/downloads/info1146-LibCustomMenu.html
|
||||||
|
`
|
||||||
|
ESO_LIVE_PATH_WINDOWS = `Documents\Elder Scrolls Online\live`
|
||||||
|
ESO_LIVE_PATH_STEAMOS = ".steam/steam/steamapps/compatdata/306130/pfx/drive_c/users/steamuser/Documents/Elder Scrolls Online/live/"
|
||||||
|
TCC_PRICE_TABLE_URI = "https://us.tamrieltradecentre.com/download/PriceTable"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ESOUI_NAME = regexp.MustCompile(`(?:https://www.esoui.com/downloads/info[0-9]+\-)([A-Za-z]+)(?:\.html)`)
|
||||||
|
ESOUI_VERSION = regexp.MustCompile(`(?:<div\s+id="version">Version:\s+)(.*)(?:</div>)`)
|
||||||
|
ESOUI_DOWNLOAD = regexp.MustCompile(`https://cdn.esoui.com/downloads/file[^"]*`)
|
||||||
|
LIVE_VERSION = regexp.MustCompile(`(?:##\s+Version:\s+)(.*)(?:\n)`)
|
||||||
|
)
|
||||||
|
|
||||||
|
func eso_live_path_get() string {
|
||||||
|
home_path, error := os.UserHomeDir()
|
||||||
|
if error != nil {
|
||||||
|
panic(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
return filepath.Join(home_path, ESO_LIVE_PATH_WINDOWS)
|
||||||
|
} else {
|
||||||
|
return filepath.Join(home_path, ESO_LIVE_PATH_STEAMOS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func addon_list_create(addon_list_path string) error {
|
||||||
|
file_open, error := os.Create(addon_list_path)
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
defer file_open.Close()
|
||||||
|
|
||||||
|
_, error = file_open.Write([]byte(CONFIG_TEMPLATE))
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func addon_list_read(addon_list_path string) ([]string, error) {
|
||||||
|
file_open, error := os.OpenFile(addon_list_path, os.O_RDONLY, 0644)
|
||||||
|
defer file_open.Close()
|
||||||
|
if error != nil {
|
||||||
|
return nil, error
|
||||||
|
}
|
||||||
|
|
||||||
|
file_scanner := bufio.NewScanner(file_open)
|
||||||
|
lines := []string{}
|
||||||
|
|
||||||
|
for file_scanner.Scan() {
|
||||||
|
line := file_scanner.Text()
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case line == "":
|
||||||
|
continue
|
||||||
|
case strings.HasPrefix(line, "#"):
|
||||||
|
continue
|
||||||
|
case strings.HasPrefix(line, "//"):
|
||||||
|
continue
|
||||||
|
case strings.HasPrefix(line, "-"):
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
lines = append(lines, line)
|
||||||
|
}
|
||||||
|
|
||||||
|
return lines, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type EsoAddon struct {
|
||||||
|
name string
|
||||||
|
version string
|
||||||
|
path string
|
||||||
|
}
|
||||||
|
|
||||||
|
func eso_ui_stat_init(addon_url string) (EsoAddon, error) {
|
||||||
|
addon_resp, error := http.Get(addon_url)
|
||||||
|
if error != nil {
|
||||||
|
return EsoAddon{}, error
|
||||||
|
}
|
||||||
|
defer addon_resp.Body.Close()
|
||||||
|
|
||||||
|
if addon_resp.StatusCode == http.StatusNotFound {
|
||||||
|
return EsoAddon{}, errors.New(http.StatusText(addon_resp.StatusCode))
|
||||||
|
}
|
||||||
|
|
||||||
|
addon_body, error := io.ReadAll(addon_resp.Body)
|
||||||
|
if error != nil {
|
||||||
|
return EsoAddon{}, error
|
||||||
|
}
|
||||||
|
|
||||||
|
download_page_url := strings.Replace(addon_url, "info", "download", -1)
|
||||||
|
download_resp, error := http.Get(download_page_url)
|
||||||
|
if error != nil {
|
||||||
|
return EsoAddon{}, error
|
||||||
|
}
|
||||||
|
defer download_resp.Body.Close()
|
||||||
|
|
||||||
|
if download_resp.StatusCode == http.StatusNotFound {
|
||||||
|
return EsoAddon{}, errors.New(http.StatusText(download_resp.StatusCode))
|
||||||
|
}
|
||||||
|
|
||||||
|
download_body, error := io.ReadAll(download_resp.Body)
|
||||||
|
if error != nil {
|
||||||
|
return EsoAddon{}, error
|
||||||
|
}
|
||||||
|
|
||||||
|
var name string
|
||||||
|
names := ESOUI_NAME.FindStringSubmatch(addon_url)
|
||||||
|
if len(names) > 1 {
|
||||||
|
name = names[1]
|
||||||
|
} else {
|
||||||
|
name = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
var version string
|
||||||
|
versions := ESOUI_VERSION.FindStringSubmatch(string(addon_body))
|
||||||
|
if len(versions) > 1 {
|
||||||
|
version = versions[1]
|
||||||
|
} else {
|
||||||
|
version = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
path := string(ESOUI_DOWNLOAD.Find(download_body))
|
||||||
|
if path == "" {
|
||||||
|
return EsoAddon{}, errors.New("Download URI missing " + addon_url)
|
||||||
|
}
|
||||||
|
|
||||||
|
return EsoAddon{name, version, path}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func eso_live_stat_init(eso_live_name string) (EsoAddon, error) {
|
||||||
|
path := filepath.Join(args.Out_dir, eso_live_name)
|
||||||
|
|
||||||
|
content, error := os.ReadFile(filepath.Join(path, eso_live_name+".txt"))
|
||||||
|
if error != nil {
|
||||||
|
return EsoAddon{}, error
|
||||||
|
}
|
||||||
|
|
||||||
|
var version string
|
||||||
|
versions := LIVE_VERSION.FindStringSubmatch(string(content))
|
||||||
|
if len(versions) > 1 {
|
||||||
|
version = versions[1]
|
||||||
|
} else {
|
||||||
|
version = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return EsoAddon{eso_live_name, version, path}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func eso_ui_get_unzip(esoui_url string, out_dir string) error {
|
||||||
|
response, error := http.Get(esoui_url)
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
defer response.Body.Close()
|
||||||
|
|
||||||
|
if response.StatusCode == http.StatusNotFound {
|
||||||
|
return errors.New(http.StatusText(response.StatusCode))
|
||||||
|
}
|
||||||
|
|
||||||
|
body, error := io.ReadAll(response.Body)
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
|
reader := bytes.NewReader(body)
|
||||||
|
zip_reader, error := zip.NewReader(reader, int64(len(body)))
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, zipped_file := range zip_reader.File {
|
||||||
|
if zipped_file.Mode().IsDir() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
zipped_file_open, error := zipped_file.Open()
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
|
name := filepath.Join(out_dir, zipped_file.Name)
|
||||||
|
os.MkdirAll(filepath.Dir(name), os.ModePerm)
|
||||||
|
|
||||||
|
create, error := os.Create(name)
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
defer create.Close()
|
||||||
|
|
||||||
|
create.ReadFrom(zipped_file_open)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ttc_update(out_path string) error {
|
||||||
|
response, error := http.Get(TCC_PRICE_TABLE_URI)
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
defer response.Body.Close()
|
||||||
|
|
||||||
|
if response.StatusCode == http.StatusNotFound {
|
||||||
|
return errors.New(http.StatusText(response.StatusCode))
|
||||||
|
}
|
||||||
|
|
||||||
|
body, error := io.ReadAll(response.Body)
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
|
reader := bytes.NewReader(body)
|
||||||
|
zip_reader, error := zip.NewReader(reader, int64(len(body)))
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, zipped_file := range zip_reader.File {
|
||||||
|
if zipped_file.Mode().IsDir() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
zipped_file_open, error := zipped_file.Open()
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
|
name := filepath.Join(out_path, zipped_file.Name)
|
||||||
|
os.MkdirAll(filepath.Dir(name), os.ModePerm)
|
||||||
|
|
||||||
|
create, error := os.Create(name)
|
||||||
|
if error != nil {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
defer create.Close()
|
||||||
|
|
||||||
|
create.ReadFrom(zipped_file_open)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -1,9 +1,11 @@
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=run eso-banana addon management
|
Description="Elder Scrolls Online addon manager and a Tamriel Trade Centre price table updater."
|
||||||
|
Wants=banana.timer
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=oneshot
|
||||||
ExecStart=banana-script
|
ExecStart=/usr/bin/banana
|
||||||
|
User=deck
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=default.target
|
WantedBy=multi-user.target
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Run eso-banana addon management once a day.
|
Description=Run banana daily and on boot.
|
||||||
|
|
||||||
[Timer]
|
[Timer]
|
||||||
OnUnitActiveSec=12h
|
OnCalendar=daily
|
||||||
Unit=banana.service
|
Persistent=true
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=timers.target
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
module banana
|
||||||
|
|
||||||
|
go 1.22.3
|
||||||
|
|
||||||
|
require github.com/alexflint/go-arg v1.5.0
|
||||||
|
|
||||||
|
require github.com/alexflint/go-scalar v1.2.0 // indirect
|
|
@ -1,19 +0,0 @@
|
||||||
[build-system]
|
|
||||||
requires = ["poetry"]
|
|
||||||
build-backend = "poetry.masonry.api"
|
|
||||||
|
|
||||||
[tool.poetry]
|
|
||||||
authors = ["py <py@py>"]
|
|
||||||
description = ""
|
|
||||||
license = "MIT"
|
|
||||||
name = "banana"
|
|
||||||
version = "0.0.1"
|
|
||||||
|
|
||||||
[[tool.poetry.packages]]
|
|
||||||
include = "banana"
|
|
||||||
|
|
||||||
[tool.poetry.scripts]
|
|
||||||
banana-script = "banana:scripts.periodical_script"
|
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
|
||||||
requests = ""
|
|
Loading…
Reference in New Issue