1
0
Fork 0
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:
Ash Keel 2023-04-23 02:59:30 +02:00
parent adc3cacc24
commit a429826e8a
No known key found for this signature in database
GPG key ID: BAD8D93E7314ED3E
5 changed files with 79 additions and 28 deletions

2
app.go
View file

@ -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) {

View file

@ -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

View file

@ -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,9 +197,26 @@ 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 {
// For prerelease builds, use the list endpoint to get the latest prerelease
if (prerelease) {
const req = await fetch(
`https://api.github.com/repos/${APPREPO}/releases`,
{
headers: {
Accept: 'application/vnd.github.v3+json',
},
},
);
const data = (await req.json()) as { html_url: string; name: string }[];
setLastVersion({
url: data[0].html_url,
name: data[0].name,
});
} else {
const req = await fetch( const req = await fetch(
`https://api.github.com/repos/${APPREPO}/releases/latest`, `https://api.github.com/repos/${APPREPO}/releases/latest`,
{ {
@ -180,6 +230,7 @@ export default function Sidebar({
url: data.html_url, url: data.html_url,
name: data.name, 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>

View file

@ -147,7 +147,7 @@ func cliMain(ctx *cli.Context) error {
} }
return dialog != "Yes" return dialog != "Yes"
}, },
Bind: []interface{}{ Bind: []any{
app, app,
}, },
}) })

View file

@ -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()