Merge pull request #658 from kasenvr/feature/add-update-notififier

Feature/add update notififier
This commit is contained in:
kasenvr 2020-09-02 18:49:13 -04:00 committed by GitHub
commit b02205e5b8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 149 additions and 4 deletions

View file

@ -23,6 +23,7 @@ var CONTROL_KEY = 67108864;
var SHIFT_KEY = 33554432;
var FLOOF_CHAT_CHANNEL = "Chat";
var FLOOF_NOTIFICATION_CHANNEL = "Floof-Notif";
var SYSTEM_NOTIFICATION_CHANNEL = "System-Notifications";
var MAIN_CHAT_WINDOW_HEIGHT = 450;
var MAIN_CHAT_WINDOW_WIDTH = 750;
@ -79,6 +80,7 @@ init();
function init() {
Messages.subscribe(FLOOF_CHAT_CHANNEL);
Messages.subscribe(SYSTEM_NOTIFICATION_CHANNEL);
historyLog = [];
try {
historyLog = JSON.parse(Settings.getValue(settingsRoot + "/HistoryLog", "[]"));
@ -435,8 +437,8 @@ function replaceFormatting(text) {
}
}
function messageReceived(channel, message) {
if (channel === "Chat") {
function messageReceived(channel, message, sender) {
if (channel === FLOOF_CHAT_CHANNEL) {
var cmd = {FAILED: true};
try {
cmd = JSON.parse(message);
@ -518,6 +520,26 @@ function messageReceived(channel, message) {
}
}
}
if (channel === SYSTEM_NOTIFICATION_CHANNEL && sender == MyAvatar.sessionUUID) {
var cmd = {FAILED: true};
try {
cmd = JSON.parse(message);
} catch (e) {
//
}
if (!cmd.FAILED) {
if (cmd.type === "Update-Notification") {
addToLog(cmd.message, cmd.category, cmd.colour, cmd.channel);
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
sender: "(" + cmd.category + ")",
text: replaceFormatting(cmd.message),
colour: {text: cmd.colour}
}));
}
}
}
}
function time() {
@ -569,7 +591,9 @@ function fromQml(message) {
cmd = processChat(cmd);
if (cmd.message === "") return;
Messages.sendMessage(FLOOF_CHAT_CHANNEL, JSON.stringify({
type: "TransmitChatMessage", channel: "Domain", colour: chatColour("Domain"),
type: "TransmitChatMessage",
channel: "Domain",
colour: chatColour("Domain"),
message: cmd.message,
displayName: cmd.avatarName
}));

View file

@ -36,7 +36,8 @@ var DEFAULT_SCRIPTS_COMBINED = [
"system/miniTablet.js",
"system/audioMuteOverlay.js",
"system/inspect.js",
"system/keyboardShortcuts/keyboardShortcuts.js"
"system/keyboardShortcuts/keyboardShortcuts.js",
"system/checkForUpdates.js"
];
var DEFAULT_SCRIPTS_SEPARATE = [
"system/controllers/controllerScripts.js",

View file

@ -0,0 +1,54 @@
// checkForUpdates.js
//
// Created by Kalila L. on 8/27/20
// Copyright 2020 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
Script.include("/~/system/libraries/utils.js");
var networkingConstants = Script.require("./libraries/networkingConstants.js");
// We'll want a way to specify this later, auto detection can also be a thing, but strictly optional.
var currentBuildType = "latest";
var currentVersion = About.buildVersion;
// Notification Variables
var NOTIFICATION_CHANNEL = "System-Notifications";
var NOTIFICATION_TYPE = "Update-Notification";
var NOTIFICATION_CATEGORY = "Interface";
var notificationText = "An update is available: ";
var notificationColor = { red: 137, green: 63, blue: 255 };
function retrieveMetadata() {
var requireMetadata = Script.require(networkingConstants.interfaceMetadataSource + '?' + Date.now());
if (requireMetadata) {
return requireMetadata;
} else {
return false;
}
}
function checkForUpdates() {
var vircadiaMetadata = retrieveMetadata();
// Don't check for updates on a dev build.
if (vircadiaMetadata && currentVersion !== "dev") {
var checkVersion = semanticVersionCompare(currentVersion, vircadiaMetadata[currentBuildType].version);
// An update is available!
if (checkVersion === -1) {
Messages.sendMessage(NOTIFICATION_CHANNEL, JSON.stringify({
type: NOTIFICATION_TYPE,
category: NOTIFICATION_CATEGORY,
channel: "Local",
position: MyAvatar.position,
colour: notificationColor,
message: notificationText + vircadiaMetadata[currentBuildType].version,
}));
}
}
}
checkForUpdates();

View file

@ -17,6 +17,7 @@ Script.include("/~/system/libraries/Xform.js");
Script.include("/~/system/libraries/controllerDispatcherUtils.js");
Script.include("/~/system/libraries/controllers.js");
Script.include("/~/system/libraries/cloneEntityUtils.js");
Script.include("/~/system/libraries/utils.js");
var DEFAULT_SPHERE_MODEL_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/equip-Fresnel-3.fbx";

View file

@ -0,0 +1,14 @@
// networkingConstants.js
//
// Created by Kalila L. on 8/27/20
// Copyright 2020 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// Interface Metadata Source
var interfaceMetadataSource = "https://cdn.vircadia.com/dist/launcher/vircadiaMeta.json";
module.exports = {
interfaceMetadataSource: interfaceMetadataSource
}

View file

@ -502,3 +502,54 @@ getMainTabletIDs = function () {
}
return tabletIDs;
};
// returns 1 if A is greater, 0 if equal, -1 if A is lesser
semanticVersionCompare = function(versionA, versionB) {
var versionAParts = versionA.split('.');
var versionBParts = versionB.split('.');
// make sure each version has 3 parts
var partsLength = versionAParts.length;
while (partsLength < 3) {
partsLength = versionAParts.push(0);
}
partsLength = versionBParts.length;
while (partsLength < 3) {
partsLength = versionBParts.push(0);
}
for (var i = 0; i < 3; ++i) {
// We're detecting if there's tags, indicating a pre-release OR it's obsolete.
var versionAPartHasTag = (versionAParts[i].indexOf('-') !== -1);
var versionBPartHasTag = (versionBParts[i].indexOf('-') !== -1);
if (versionAPartHasTag || versionBPartHasTag) {
// In semantic versioning, if version A has a tag and B does not, B is a higher version.
if (versionAPartHasTag < versionBPartHasTag) {
return 1;
} else if (versionAPartHasTag > versionBPartHasTag) {
return -1;
} else {
// They both have tags
var splitA = versionAParts[i].split('-')[0];
var splitB = versionBParts[i].split('-')[0];
if (splitA < splitB) {
return -1;
} else if (splitA > splitB) {
return 1;
}
}
} else { // Else, they're both numbers so compare the strings as if they were.
if (versionAParts[i] < versionBParts[i]) {
return -1;
} else if (versionAParts[i] > versionBParts[i]) {
return 1;
}
}
}
// They're both equal!
return 0;
}