mirror of
https://git.sr.ht/~ashkeel/strimertul
synced 2024-09-20 02:00:49 +00:00
fix: The UPDATE AVAILABLE banner works properly in prerelase builds
This commit is contained in:
parent
adc3cacc24
commit
a429826e8a
5 changed files with 79 additions and 28 deletions
2
app.go
2
app.go
|
@ -268,7 +268,7 @@ func (a *App) GetAppVersion() VersionInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) interactiveAuth(client kv.Client, message map[string]interface{}) bool {
|
func (a *App) interactiveAuth(client kv.Client, message map[string]any) bool {
|
||||||
callbackID := fmt.Sprintf("auth-callback-%d", client.UID())
|
callbackID := fmt.Sprintf("auth-callback-%d", client.UID())
|
||||||
authResult := make(chan bool)
|
authResult := make(chan bool)
|
||||||
runtime.EventsOnce(a.ctx, callbackID, func(optional ...any) {
|
runtime.EventsOnce(a.ctx, callbackID, func(optional ...any) {
|
||||||
|
|
|
@ -64,7 +64,7 @@ func (mod *LocalDBClient) Close() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mod *LocalDBClient) GetKey(key string) (string, error) {
|
func (mod *LocalDBClient) GetKey(key string) (string, error) {
|
||||||
res, err := mod.makeRequest(kv.CmdReadKey, map[string]interface{}{"key": key})
|
res, err := mod.makeRequest(kv.CmdReadKey, map[string]any{"key": key})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -72,14 +72,14 @@ func (mod *LocalDBClient) GetKey(key string) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mod *LocalDBClient) PutKey(key string, data string) error {
|
func (mod *LocalDBClient) PutKey(key string, data string) error {
|
||||||
_, err := mod.makeRequest(kv.CmdWriteKey, map[string]interface{}{"key": key, "data": data})
|
_, err := mod.makeRequest(kv.CmdWriteKey, map[string]any{"key": key, "data": data})
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mod *LocalDBClient) SubscribePrefix(fn kv.SubscriptionCallback, prefixes ...string) (err error, cancelFn CancelFunc) {
|
func (mod *LocalDBClient) SubscribePrefix(fn kv.SubscriptionCallback, prefixes ...string) (err error, cancelFn CancelFunc) {
|
||||||
var ids []int64
|
var ids []int64
|
||||||
for _, prefix := range prefixes {
|
for _, prefix := range prefixes {
|
||||||
_, err = mod.makeRequest(kv.CmdSubscribePrefix, map[string]interface{}{"prefix": prefix})
|
_, err = mod.makeRequest(kv.CmdSubscribePrefix, map[string]any{"prefix": prefix})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err, nil
|
return err, nil
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ func (mod *LocalDBClient) SubscribePrefix(fn kv.SubscriptionCallback, prefixes .
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mod *LocalDBClient) SubscribeKey(key string, fn func(string)) (err error, cancelFn CancelFunc) {
|
func (mod *LocalDBClient) SubscribeKey(key string, fn func(string)) (err error, cancelFn CancelFunc) {
|
||||||
_, err = mod.makeRequest(kv.CmdSubscribeKey, map[string]interface{}{"key": key})
|
_, err = mod.makeRequest(kv.CmdSubscribeKey, map[string]any{"key": key})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err, nil
|
return err, nil
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ func (mod *LocalDBClient) SubscribeKey(key string, fn func(string)) (err error,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mod *LocalDBClient) GetJSON(key string, dst interface{}) error {
|
func (mod *LocalDBClient) GetJSON(key string, dst any) error {
|
||||||
res, err := mod.GetKey(key)
|
res, err := mod.GetKey(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -120,19 +120,19 @@ func (mod *LocalDBClient) GetJSON(key string, dst interface{}) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mod *LocalDBClient) GetAll(prefix string) (map[string]string, error) {
|
func (mod *LocalDBClient) GetAll(prefix string) (map[string]string, error) {
|
||||||
res, err := mod.makeRequest(kv.CmdReadPrefix, map[string]interface{}{"prefix": prefix})
|
res, err := mod.makeRequest(kv.CmdReadPrefix, map[string]any{"prefix": prefix})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
out := make(map[string]string)
|
out := make(map[string]string)
|
||||||
for key, value := range res.Data.(map[string]interface{}) {
|
for key, value := range res.Data.(map[string]any) {
|
||||||
out[key] = value.(string)
|
out[key] = value.(string)
|
||||||
}
|
}
|
||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mod *LocalDBClient) PutJSON(key string, data interface{}) error {
|
func (mod *LocalDBClient) PutJSON(key string, data any) error {
|
||||||
byt, err := json.Marshal(data)
|
byt, err := json.Marshal(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -141,8 +141,8 @@ func (mod *LocalDBClient) PutJSON(key string, data interface{}) error {
|
||||||
return mod.PutKey(key, string(byt))
|
return mod.PutKey(key, string(byt))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mod *LocalDBClient) PutJSONBulk(kvs map[string]interface{}) error {
|
func (mod *LocalDBClient) PutJSONBulk(kvs map[string]any) error {
|
||||||
encoded := make(map[string]interface{})
|
encoded := make(map[string]any)
|
||||||
for k, v := range kvs {
|
for k, v := range kvs {
|
||||||
byt, err := json.Marshal(v)
|
byt, err := json.Marshal(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -160,13 +160,13 @@ func (mod *LocalDBClient) RemoveKey(key string) error {
|
||||||
return mod.PutKey(key, "")
|
return mod.PutKey(key, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mod *LocalDBClient) makeRequest(cmd string, data map[string]interface{}) (kv.Response, error) {
|
func (mod *LocalDBClient) makeRequest(cmd string, data map[string]any) (kv.Response, error) {
|
||||||
req, chn := mod.client.MakeRequest(cmd, data)
|
req, chn := mod.client.MakeRequest(cmd, data)
|
||||||
mod.hub.SendMessage(req)
|
mod.hub.SendMessage(req)
|
||||||
return getResponse(<-chn)
|
return getResponse(<-chn)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getResponse(response interface{}) (kv.Response, error) {
|
func getResponse(response any) (kv.Response, error) {
|
||||||
switch c := response.(type) {
|
switch c := response.(type) {
|
||||||
case kv.Response:
|
case kv.Response:
|
||||||
return c, nil
|
return c, nil
|
||||||
|
|
|
@ -153,6 +153,39 @@ function SidebarLink({ route: { title, url, icon } }: { route: Route }) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseVersion(semanticVersion: string) {
|
||||||
|
const [version, prerelease] = semanticVersion.split('-', 2);
|
||||||
|
const [major, minor, patch] = version.split('.').map((x) => parseInt(x, 10));
|
||||||
|
return { major, minor, patch, prerelease };
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasLatestOrBeta(current: string, latest: string): boolean {
|
||||||
|
// If current version has no prerelease tag, just do a string check
|
||||||
|
if (!current.includes('-', 6)) {
|
||||||
|
return current.startsWith(latest);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Split MAJOR/MINOR/PATCH and check each
|
||||||
|
const parsedCurrent = parseVersion(current);
|
||||||
|
const parsedLatest = parseVersion(latest);
|
||||||
|
|
||||||
|
if (
|
||||||
|
parsedCurrent.major > parsedLatest.major ||
|
||||||
|
parsedCurrent.minor > parsedLatest.minor ||
|
||||||
|
parsedCurrent.patch > parsedLatest.patch
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If latest has no prerelease, we assume stable
|
||||||
|
if (!parsedLatest.prerelease) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort by prerelease (this breaks with high numbers but hopefully we won't get to alpha.10)
|
||||||
|
return parsedCurrent.prerelease > parsedLatest.prerelease;
|
||||||
|
}
|
||||||
|
|
||||||
export default function Sidebar({
|
export default function Sidebar({
|
||||||
sections,
|
sections,
|
||||||
}: SidebarProps): React.ReactElement {
|
}: SidebarProps): React.ReactElement {
|
||||||
|
@ -164,22 +197,40 @@ export default function Sidebar({
|
||||||
null,
|
null,
|
||||||
);
|
);
|
||||||
const dev = version && version.startsWith('v0.0.0');
|
const dev = version && version.startsWith('v0.0.0');
|
||||||
|
const prerelease = !dev && version.includes('-', 6);
|
||||||
|
|
||||||
async function fetchLastVersion() {
|
async function fetchLastVersion() {
|
||||||
try {
|
try {
|
||||||
const req = await fetch(
|
// For prerelease builds, use the list endpoint to get the latest prerelease
|
||||||
`https://api.github.com/repos/${APPREPO}/releases/latest`,
|
if (prerelease) {
|
||||||
{
|
const req = await fetch(
|
||||||
headers: {
|
`https://api.github.com/repos/${APPREPO}/releases`,
|
||||||
Accept: 'application/vnd.github.v3+json',
|
{
|
||||||
|
headers: {
|
||||||
|
Accept: 'application/vnd.github.v3+json',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
);
|
||||||
);
|
const data = (await req.json()) as { html_url: string; name: string }[];
|
||||||
const data = (await req.json()) as { html_url: string; name: string };
|
setLastVersion({
|
||||||
setLastVersion({
|
url: data[0].html_url,
|
||||||
url: data.html_url,
|
name: data[0].name,
|
||||||
name: data.name,
|
});
|
||||||
});
|
} else {
|
||||||
|
const req = await fetch(
|
||||||
|
`https://api.github.com/repos/${APPREPO}/releases/latest`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Accept: 'application/vnd.github.v3+json',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
const data = (await req.json()) as { html_url: string; name: string };
|
||||||
|
setLastVersion({
|
||||||
|
url: data.html_url,
|
||||||
|
name: data.name,
|
||||||
|
});
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// TODO Report error nicely
|
// TODO Report error nicely
|
||||||
console.warn('Failed checking upstream for latest version', e);
|
console.warn('Failed checking upstream for latest version', e);
|
||||||
|
@ -209,7 +260,7 @@ export default function Sidebar({
|
||||||
{!dev &&
|
{!dev &&
|
||||||
version &&
|
version &&
|
||||||
lastVersion &&
|
lastVersion &&
|
||||||
!version.startsWith(lastVersion.name) && (
|
!hasLatestOrBeta(version, lastVersion.name) && (
|
||||||
<UpdateButton href={lastVersion.url}>
|
<UpdateButton href={lastVersion.url}>
|
||||||
{t('menu.messages.update-available')}
|
{t('menu.messages.update-available')}
|
||||||
</UpdateButton>
|
</UpdateButton>
|
||||||
|
|
2
main.go
2
main.go
|
@ -147,7 +147,7 @@ func cliMain(ctx *cli.Context) error {
|
||||||
}
|
}
|
||||||
return dialog != "Yes"
|
return dialog != "Yes"
|
||||||
},
|
},
|
||||||
Bind: []interface{}{
|
Bind: []any{
|
||||||
app,
|
app,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
|
@ -174,7 +174,7 @@ func SetupAlerts(bot *Bot) *BotAlertsModule {
|
||||||
}
|
}
|
||||||
writeTemplate(bot, tpl, sub)
|
writeTemplate(bot, tpl, sub)
|
||||||
}
|
}
|
||||||
addPendingSub := func(ev interface{}) {
|
addPendingSub := func(ev any) {
|
||||||
switch sub := ev.(type) {
|
switch sub := ev.(type) {
|
||||||
case helix.EventSubChannelSubscribeEvent:
|
case helix.EventSubChannelSubscribeEvent:
|
||||||
pendingMux.Lock()
|
pendingMux.Lock()
|
||||||
|
|
Loading…
Reference in a new issue