From 247b808b8b0359a54798eba488c1d380937bbed1 Mon Sep 17 00:00:00 2001 From: molenzwiebel Date: Sat, 13 Jan 2018 22:16:36 +0100 Subject: [PATCH] :iphone: Future-proof version check --- .../components/champ-select/champ-select.ts | 1 - web/src/components/invites/invites.ts | 9 ++++---- web/src/components/root/root.ts | 5 +++-- web/src/util/version.ts | 21 +++++++++++++++++++ 4 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 web/src/util/version.ts diff --git a/web/src/components/champ-select/champ-select.ts b/web/src/components/champ-select/champ-select.ts index 1efa2e2..4ccf518 100644 --- a/web/src/components/champ-select/champ-select.ts +++ b/web/src/components/champ-select/champ-select.ts @@ -152,7 +152,6 @@ export default class ChampSelect extends Vue { // Observe runes this.$root.observe("/lol-perks/v1/pages", response => { - console.log("Got perks update."); response.status === 200 && (this.runePages = response.content); response.status === 200 && (this.runePages.sort((a, b) => a.order - b.order)); }); diff --git a/web/src/components/invites/invites.ts b/web/src/components/invites/invites.ts index b192419..027d38e 100644 --- a/web/src/components/invites/invites.ts +++ b/web/src/components/invites/invites.ts @@ -48,12 +48,11 @@ export default class Invites extends Vue { // Start observing invitation changes. this.$root.observe("/lol-lobby/v2/received-invitations", handleInvitationUpdate); - // 1.1.0 does not support observing endpoints that don't return objects (invitations returns an array) - // gracefully fall back and periodically poll instead. Anything above 1.1.0 supports it, and since 1.1.0 - // was the first public version, a simple comparison is fine. - if (this.$root.peerVersion === "1.1.0") { + // Anything below 1.2.0 does not support observing anything that does not return an object. + // Opt for polling instead. + if (!this.$root.peerVersion.greaterThan(1, 1, 0)) { console.log("Using polling to watch invites."); - setInterval(handleInvitationUpdate, 5000); + setInterval(handleInvitationUpdate, 3000); } // Check for initial pending invites. diff --git a/web/src/components/root/root.ts b/web/src/components/root/root.ts index f260e7d..36b099b 100644 --- a/web/src/components/root/root.ts +++ b/web/src/components/root/root.ts @@ -6,6 +6,7 @@ import Queue from "../queue/queue.vue"; import ReadyCheck from "../ready-check/ready-check.vue"; import ChampSelect from "../champ-select/champ-select.vue"; import Invites from "../invites/invites.vue"; +import Version from "../../util/version"; // Represents a result from the LCU api. export interface Result { @@ -32,7 +33,7 @@ type WebsocketMessage = [1, string, number, any] | [2, number, number, any] | [3 export default class Root extends Vue { connected = false; socket: WebSocket; - peerVersion: string = ""; + peerVersion: Version = null; // null is required to allow vue to observe notifications: string[] = []; discoveryButtonType = "normal"; @@ -127,7 +128,7 @@ export default class Root extends Vue { * haywire. This works fine though, so we use this instead. */ private setPeerVersion(version: string) { - this.peerVersion = version; + this.peerVersion = new Version(version); } /** diff --git a/web/src/util/version.ts b/web/src/util/version.ts new file mode 100644 index 0000000..671d339 --- /dev/null +++ b/web/src/util/version.ts @@ -0,0 +1,21 @@ +/** + * Very simple semver-ish implementation of the Conduit version + * so we can perform some checks based on its version. + */ +export default class Version { + public readonly major: number; + public readonly minor: number; + public readonly patch: number; + + constructor(version: string) { + const [major, minor, patch] = version.split("."); + + this.major = +major; + this.minor = +minor; + this.patch = +patch; + } + + greaterThan(major: number, minor: number, patch: number): boolean { + return this.major > major || this.minor > minor || this.patch > patch; + } +} \ No newline at end of file