November 10, 2019. New Moose build. Got .WriteFile(), 4 languages for Home and Exit in systray menu. User.IsActive() === true within 5 seconds of keypress or mouse move, not exactly what I needed.
See also: Steve’s To-do list. and Previous Builds.
Last updated this to-do list below: November 14, 2019.
small things for next build
- User.Latitude / User.Longitude set from ipstack.com (unless already have values entered by user)
- Network error which you record into Errors.bin, also send via Event to Errors plugin.
- After doing install updates, C# needs to reset after a few hours, to allow checking for newer updates to succeed and be installed (This is for people on laptops who never quit the moose )
Other little useful things for a Moose build
- for CAPS-LOCK, a C# function to Get and Set CapsLockQuietOnOff
- a C# function to wiggle the mouse by 1 pixel. (steve’s way please)
- The green error “In between visemes smile behavior”. Make it silently restart everything. No green error shown.
High Priority
- One-button Installer, MooseSetup.exe.
- Background picture, load WPF, text in 4 languages, text has WPF shadows, Buttons use the blue style with 3D look and shadows. A link to a URL. As discussed.
- CheckUpdates messages for “too old” moose.
- If Moose.exe realizes it’s is too old to update itself, then Updates.CheckUpdates(UpdatesSuccess, UpdatesFail); should pass to the UpdatesFail(theError) a message “too old”.
- The Event: Events.OnEvent(“Updates Available”,InitialGetUpdates); which is sent by Moose.exe, should pass a parameter, theStatus, either ‘ok’ or ‘too old’.
- (POSSIBLY FIXED AFTER INSTALLER). Error Messages reworded. Not just “Error Code 1012″ or” Cannot load Framework Services”. I’m serious. Show a custom MessageBox if you need to, instead of the common pathway for all the other errors. Explain these errors in words like, some required files aren’t in the correct place. Or Your PC seems too old.
- (PROBABLY FIXED) When a new plugin is added via Updates, and then the View is opened, it will crash, green error. Something that is initialized during startup is missing, and should be explicitly done after a new plugin comes from Updates.
- Stop saving changes to these files on a schedule, and not at shutdown, only when they actually change. This is a vulnerability. Laptops running out of power could be causing file corruption.
- abc\Settings_234234233434.txt . Also, it’s a useless file with useless info.
- Can I delete all the abc\en-US\Settings_234234234.txt files? I think you are storing new ones into abc\ folder.
- Moose.xml. This gets saved every minute. If it’s because of Streams, surely that can be saved less often.
- Error 10008, I think it’s a Moose3D error from a motherboard that can’t do 3D graphics to our standards. Can you find that particular error, and give it a nicely worded sentence instead.
- Related: Please send me again, the C++ file with the error codes. I will once again work on 4 language translations.
- The “Ooooppp” error. shown in diagram. Happens when moose auto- restarts after the PC restarts. But despite the green error message, the rest of the Moose runs normally. This isn’t an error condition. Please don’t show this dialog to normal users.
Azure API URL #1 with Node.js
name includes v3HitCounter
Step 1. Create a URL to receive this POST, containing this JSON.
var OuterJSON = {
“version”:3,
“UserDotName”:”defaultFullName”,
“UserName”:”defaultSayName”,
“UserDotEmail”:”defaultEmail”,
“UserDotCountry”:”defaultCountry”,
“UserWhole”:”defaultWhole”
};
var theIfy = “” + JSON.stringify(OuterJSON);
if ( theIfy !== null && theIfy.length > 0 ) {
Http.Post(theURL, theIfy, OnPostSuccess, OnPostError, “Hit Counter”); // not using last 2 arguments: timeout, dataType
}
Step 2.
Create a key-value pair to store a value: called “startups”:”1″
Get the current value of startups,
incremenet by one.
Store the new value.
Step 3.
Create a key-value pair to store a value: called “names”:”Steve,Jenny”
Get the current value of names, into a var called theNames
use this code to append onto it:
if ( theNames.length > 0 && theNames.length < 600 ) {
theNames += “, “;
}
theNames += OuterJSON.UserName;
store the new value into key-value “names”:”Steve,Jenny,Bob”
Step 4.
Create a file that can whole much more length than a single key-value. A file that might grow to 100GB eventually, if we ignore it.
Do logic to test if the length is exceeding the max length of a string.
if ( LengthOfFile < MaxLengthOfString ) {
}
Read the file into a string var, called theWhole,
so that string-manipulations commands can be done to it.
Here’s the code to append some json onto it:
var theWhole = readFile(‘whole’);
theWhole = “” + theWhole; // Make sure the string test of .length will work next.
if ( theWhole.length === 0 ) {
theWhole = ‘{“Decrypt”:[“‘ + OuterJSON.UserWhole + ‘”]}’;
} else {
var thePosition = theWhole.indexOf(‘Decrypt’);
if ( thePosition > -1 ) {
if ( theWhole.length < 24000 ) {
theWhole = theWhole.substring(0,theWhole.length-3) + ‘,”‘;
theWhole += OuterJSON.UserWhole + ‘”]}]’;
}
} else {
theWhole = theWhole.substring(0,theWhole.length-1);
theWhole += ‘,{“Decrypt”:[“‘ + OuterJSON.UserWhole + ‘”]}]’;
}
}
writeFile(‘whole’,theWhole);
step 5.
POST to our webhook URL https://cloud.talkingmoose.org/api/webhooks
theJSON = {
“user_id”:”581e69d9-0a18-412b-8443-16e560e6f261″,
“eventname”:”UserDB Total users so far”,
“eventdata”:value-from-key-value-pair:”startups”, // see step 2.
}
Azure API URL #2
named MidnightReset
If Azure doesn’t have a way to trigger this on a clock time, then Zapier will post to it to do it using the URL. If Azure can trigger this at the correct midnight, then it doesn’t need a URL for this job.
It should be triggered at midnight of timezone -10, which is western tip of Alaska.
Step 1
Get the final daily value of key-value “startup”
var theCurrentStartup = value-of-“startup”; // save this value in a javascript var.
then the azure key-value named “startup” is set to 0
the azure key-value named “names” is set to ”
Step 2
A key-value named “Dailystartups”
get the value, it’s a string.
var theString = “” + “DailyStartups”; // make sure it’s a string.
if (theString.length > 290 ) {
var thePosition = theString.indexOf(‘,’);
theString = theString.substring(thePosition+1);
}
if ( theString.length > 0 ) {
theString += ‘,’;
}
theString += theCurrentStartup;
save theString into key-value “Dailystartups”
Azure API URL #3 GetWhole
Should test if if user is logged in, and if possible, is DrHalls
Step 1. Get the file var theWhole = readFile(‘whole’);
Step 2. POST to Webhooks API, with this JSON:
var theJSON = { “user_id”:”581e69d9-0a18-412b-8443-16e560e6f261″,
“target”:”UserDB”,”whole”:theWhole }
Step 3. Set theWhole = ‘[{“what”:”nothing”}]’;
writeFile(‘whole’,theWhole’);
Notes: Should be file-locking to prevent API #3 from happening simultaneously with API #1. If there is ever an error, it’s fairly safe to just reset theWhole = ‘[{“what”:”nothing”}]’; so it can hopefully learn about this user again tomorrow.
Azure API URL #4 AdReply
Similar to #1, but for storing the data about which user has just heard which ad, until it can be fetched by Dr. Halls into the AdManager plugin.
Before Beta test.
- For Twitter plugin, for New User Detected, I think we need a C# function logout and forget the previous user.If one user gives a Moose copy to a friend, the friend shouldn’t automatically be using the original Twitter account.
- Most of the Twitter code in abc/Scripts/02_Plugins.js can move into the Twitter plugin.
- Remove a certain capability.
- Check C# code for Weather. Zipcode bug. API.GetWeather(location, ReceiveOpenWeather, function (error) {}
- Check that using only zipcode is using the correct URL query parameters. See https://openweathermap.org/current
- Add another json field for language code, and use &lang query parameter, and default to ‘en’ if not available.
- I think we shall switch to AccuWeather next, it has more languages, and can do postal codes outside the US. Code for both, but don’t switch yet.
Quick and Easy
- User.Latitude and all User.somethings should return empty string, not null, if there is no value.
- Resources.Settings.Remove() rename from .RemoveSetting()
Delete unused code.
- If C# function Moose.OpenStreamView(‘Minutes Channel’); is now obsolete, lets delete it.
- I think we don’t need User.FacebookId anymore.
- The Moose.ShowNotifyIcon() function is not neede. Delete it.
- Cloud.SendKillCommand() is available now in .js, but I think it’s now obsolete. Ivan made the older Moose quit automatically. So delete the javascript one.
- User.SaveChanges(); Ivan thinks it’s now redundant, but Ivan wants one plugin to still call it at Shutdown as a precaution.Still needed? I think not needed, and confusing to exist.
- Steve commented this out of UserInfo.js on July 9, 2018.
And not needed in August. OK, Delete this from the C# code, it’s no longer used.
- Steve commented this out of UserInfo.js on July 9, 2018.
- Remove the C# green window for “Said What”, available from the right-click systray menu.
- It’s no longer needed. The Said plugin is better now.A few things don’t get into the Said plugin. For example, internet error messages. Please add the event Trigger to send internet error messages to the Said plugin.
- ThreadLock(), lock.enter(), lock.exit()
- Plugin.GetCloudSettings(), Plugin.SyncSettings()
- function GetValueById(), <AutoSave>False</AutoSave>,
- Delete 2 files in bottom of Plugins folder: easeInOutCubic.gif and Stream.html
- Ivan will delete MooseInstanceNotification StringGroup from Strings.txt
Ivan decided
to work on these. They weren’t on my to-do list, but will be awesome and ultimately necessary.
- Paid plugins and security.
- Such as downloading code for .js and .html from cloud, and inserting it into Plugin.js and Plugin.html before use. (Note to self: Ivan can compile javascript into a DLL. )
- In a marketplace scenario, 3rd party plugin creators of paid plugins will want their code protected, so others can’t simply copy it.
- Steve’s interested in this for protecting Persuasion.js
- Hopefully files get onto a CDN, and mildly encrypted in transit.
High priority after Beta test starts
- The sign-in Azure TENANT somehow needs 4 languages.
- Azure Tennant login tokens are not being saved by Login.js, so when I run from Dropbox and use different PCs, I have to re-login. But if I use the same PC, it is happy to let me auto login. So maybe this is good enough.
- Don’t save files in Debug folder like IoT.bin or Threads.bin if the user is not logged in.
- RunNextAt, don’t save to Settings. Don’t read from Settings at startup.
- A C# function for the Size.html plugin, to find-out the monitor size, and grey-out the Largest size buttons, if the size would be >= 50%, unless the user toggles a button to enable the larger sizes.
- A New-User-Detected reset of size, could set the Smallest size when the user is on a laptop.
- When “new user detected”, put all the info from ipstack.com into the User info, including
- Latitude, Longitude,Timezone, Country, CountryCode, etc
- Need new creation of User.CountryCode, User.TimezoneSeconds, User.IsDaylightSavings from ipstack.com data.
- Code Updates.Install() to receive the string with comma-separated list of plugins to not-update. Rather than IDs to include.
- A C# setting, with Get and Set for Javascript, turns on checking if a Settings.xml file has been modified unexpectedly by an external program like Dropbox. If found, the Moose would exit without saving anything. Or maybe it disables just the plugin. I’ll put this setting in the AutoStartup plugin.
- The internal URLs used for API calls to our cloud, should have features added, like query strings, to make it harder for probing brute force to figure out how our APIs work.
- In abc/Scripts/02_Plugins.js take new ActiveXObject out of the function and make it happen once per plugin.
- Adjust Critical Updates so that they can happen very early, before Moose3D crashes from graphics card troubles. There will always be someone trying crazy things, like linux running Mac running win10 on a rasberry pi, and they try to run the Moose.
- The start times for Streams: Morning, Afternoon, Evening. Most Moose users will never change these, so all users will be starting at exactly the same times, and that could cause Web fetching by thousands of Moose users at exactly the same moment.
- If a hundred thousand or million Moose users were doing Weather once in the afternoon, it would be an instant DDoS attack.
- I think we need to give some randomness to the start times of these 3 streams.
- This is done once at Moose.exe startup, set a flag for that. Any other instances when the next stream time is calculated, should be exact, so users doing editing aren’t confused.
- How about adding Random(0,300000) milliseconds to those stream starting times.
- A C# function that returns a list of all plugins found in the plugins folder
- So that Home.html can show them in a menu
- After removing the ones that are already in other pre-made menus.
- Then we can remove the plugin list from the right-click systray menu.
- Store points on the cloud
- And needs arithmetic logic to detect if a hacked absurd value is being stored.
- Add Paypal to our talkingmoose.com website,
Or use an eCommerce platform: https://zapier.com/learn/ecommerce/best-ecommerce-shopping-cart-software/ - The Studio -> Windows tab, shows green windows.
- Completely obsolete, unused: Welcome,Gift,Login,Save Changes. (see also: Moose.xml )
- Moose3D Init window. has ugly, unreadable buttons. Only needs Try Again, and Quit buttons.
- Can you add to this Studio -> Windows tab, the new user reset dialog? I need to make sure it has proper size for laptops.
- This error message is not helpful: Misused header name. Make sure request headers are used with HttpRequestMessage, response headers with HttpResponseMessage, and content headers with HttpContent objects.
- Use: “Don’t send an Accept application/json header”. or “Don’t send a Content-Type application/json header”. or “Don’t send a custom user agent header.”
- Ie, tell people how to fix their code. Don’t make them guess.
The Rest
- Ivan had added logging which noticed that my main event loop could sometimes have 3 second delays, while his is 100ms.
- This was trying to understand why Moose3D sometimes freezes until motion of mouse occurs.
- Perhaps it’s time to remove that logging.
- The black window frame, make the horizontal bar do drag near the horns and resize near the corners.
- Do we have C# get and set for proxies and custom user agents?Having custom user-agents, is important to me.
- Azure calls Ipstack.com and gets Latitude and Longitude. Please check if User.Latitude and User.Longitude are empty, and if so, put the values into there, so that my Hit Counter can send it to UserDB.
Also, please create a User.IPaddress, using what Azure knows about the user, so that plugins like UserDB can use it, if they need to. - Ivan’s improvements to networking, affecting Http.Post and also XmlHttpRequest using request.setResponseHeader(‘Content-type’,’application/json’)
- C# sends error, but it should actually be perfectly legal for a XmlHttpRequest POST to specify that header. Yes, it’s the default anyway, just ignore it, don’t error.
- SORT-OF-DONE. ( but speaking from Settings-es.xml). Change Moose.exe from speaking certain errors, using Strings.txt, and instead send Events, so that the Error.js plugin can do translations.
- For these <StringGroup>s: NoInternetErrors, DNSNameResolutionFailureErrors, RequestTimeoutErrors, RequestErrors, MooseInstanceNotification
- Events.TriggerEvent(“Error.js speaks message”,theType, theFriendlyName, theErrorMessage);
- theType is those StringGroup names, above.
- theFriendlyName is speakable name for service,
- theErrorMessage, is whatever was returned from service, or empty string.
- Then remove those <StringGroup>s from Strings.txt
- In Moose3D.exe, if the moose size is very small, 300 width or less, do not show eyelashes, to avoid blocky moire patterns
- Pass clicks through Moose3D to windows below.
- A C# command to test if a JSON file exists in the local plugin folder.
- Dialogflow v2 SDK into Azure,
- For authentication tokens for the Chat.js plugin.
https://dialogflow.com/docs/sdks
- For authentication tokens for the Chat.js plugin.
- Google Oauth API for google sheets.
- Not needed for research, but probably other future plugins.
- If a user deletes their email in the UserInfo plugin, User.Info becomes empty and presumably saved to the cloud.
- Do we still have a record of their email somewhere, in case I want to send them reminders to return to using the Moose after some time away, or email other info?
- The app on app.talkingmoose.org, for Microphone from cellphone, sent via webhooks. Doesn’t work right now. Check if WebHooks URL needs updating.
- A C# function for using Caps Lock. A Get and Set, used by QuietHours plugin, based on CapsLockQuietOnOff. If CapsLockQuietOnOff===”True” and CapsLock key is down, then C# code for Moose.Say() should not speak audibly. But High Priority things should be spoken, no matter what.
- A C# function to wiggle the mouse by 1 pixel.
- Ivan recommeds https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-setthreadexecutionstate .
- But Ivan’s way would let Screensavers run, which cover-up the Moose, and would allow Power settings to turn off the display and might allow computer to sleep. So wiggling the Mouse, seems better.
- When Home and Office PCs both run the Moose, lets say Office is active, Home is idle, the Moose on Home will get a shutdown message.
- Can Hello plugin get an event with info about When, and IP address of whoever caused it. This will allow Home Moose to speak about it during the next startup.
- ( Maybe someone sneaked into my Office while I was actually at home)
- ( or maybe, Office has auto-startup set, and Windows rebooted the idle Office while I was actually Home.)
- The green error for “In between visemes smile behavior”, is a threading error, which Ivan wants to catch, but all other users shouldn’t be subjected to it. Please add some logic where it makes Moose restart Moose3D or like that, and only Ivan experiences a debugging opportunity. No Green error anymore.
- This can wait till after a few people have tested the Moose. The Azure functions on the cloud can be improved with code added that limits them to using only the services they actually use, and not have access to every possible Azure thing. It’s protection against a successful hack into Azure, to limit damage
- If Moose3D.exe doesn’t receive any movement commands via MMF at all, for 10 seconds or more, it should make the Moose disappear from view.
- We need a setting to Enable/Disable this, for testing purposes. It can be disabled now and during early beta testing, but really does need this coding to be done.
- We need some code that tries once or twice, to wake up Moose.exe, perhaps with forcing the mouse to move, and if that fails, relaunch Moose.exe
- “Moose is loading” shown above SysTray when Moose starts.
- Ivan says a new WebView with .NET 3 core, is coming.
- It might be possible to code WebView now.
- The Webpages.js plugin, which renders offscreen, needs a browser supporting Javascript ES6, because most popular websites worthy of scraping, are probably using JS libraries that use ES6.
- later, after gaining familiarity with WebView coding, convert all plugin Views to use WebView instead of older WebBrowser.
- Or Maybe use Chromium Embedded Framework and forget about Microsoft for this one.
- OR.. get the Gab.com open source fork of chromium and Brave.
- Add ESNI, encrypted SNI, https://blog.cloudflare.com/esni/ https://www.eff.org/deeplinks/2018/09/esni-privacy-protecting-upgrade-https so that users won’t be spied on by their ISP regarding what websites they fetch from. Also change TTR mode to 3, ( Trusted Recursive Resolver ) to stop DNS-level blocking and allow ESNI to work. https://blog.nightly.mozilla.org/2018/06/01/improving-dns-privacy-in-firefox.
- Activity functions for Calendar plugin and On-the-Hour plugin:
- Problem: I’m out of the room, the Moose speaks a Calendar event, and I don’t hear it.
- Function 1 Create a C# function that returns the time of the last activity results with mouse move or keypress or microphone audio burst or scrollwheel move
- So the plugin can save the sentences until it is sure the user is nearby to hear it.
- Calendar plugin .js can call this function periodically via Timers.setTimer(), but Ivan suggests using an event. I’d prefer a function, at the moment.
- Function 2 Create a C# function that notices “inactivity” defined as no movement for 5 minutes or longer, sets IsInactivity true.
- Function 3. A C# function notices when “activity” resumes after “inactivity” and sends an event to plugins.
- Useful for:
- Problem: Suppose its after bedtime, Quiet Hours is ON, but the user is staying up late, working on their PC.
- The Moose can tell the user to Go to bed, at 1am, 2am, etc, but should only do it, if user activity is detected, like mouse movement or keyboard activity.
- High priority can be used in Moose.Say()
- So the activity function created above for the Calendar plugin, will be handy in the On-the-Hour plugin too. And for Ads
- Moving all the editable animation parameters, into hard-coded Moose3D.exe, severely reducing or eliminating Scene.xml.
- Cloud-save settings. Anything not completed yet regarding Cloud credentials for APIs? I’m’ not using it, and I should.
- Plugins need icons, for App store future.
- Ivan to create a AWS login for himself, with 2 factor verification,
- and Steve needs to do the same and improve his password.
- Microphone for Ambient. Don’t interrupt human speech
- An On/Off that a plugin can change ambient microphone on/off. (different from speech recognition on/off). This is detect audio spikes
- Need code that recognizes background sound volume, and recognizes volume spikes compared to previous.
- Presence of volume spikes, means go ahead with save:activenear, useful for Webhooks and Calendar
- Presence of volume spikes, means don’t Speak from Say queue, allow 3 secs of silence first.
- Presence of volume spikes, turns on local microsoft speech recognition.
- 4 minutes without volume spikes, turns off local microsoft speech recognition.
- I think audio-spike detection is as simple as summing the Absolute Values ABS() of each data point in the audio soundwave. and comparing to a threshold.
- Microphone for chat.
- For Chatbot, will need audio sentences to send to a Speech-to-Text API.
- Will need an On/Off, for ALL speech recognition. that the Chat plugin can change.
- When ON, the local microsoft speech recognition is not yet actually running. Lets make it actually turn on when a burst of audio, of any kind, is detected on the microphone. And lets turn it off automatically after 4 minutes without audio bursts.
- When local microsoft speech recognition is ON and running, we can have it listen for a specific phrase like “Hey Moose”. ( plus a few others like “Thank-you Moose”.)
- When “Hey Moose” is recognized by local microsoft speech recognition, it automatically switches to using Azure speech recognition.
- We can let a plugin configure whether to use Azure, or Google, or a few other providers, but coded in C#.
- We’ll turn off Azure speech recognition, if there’s 3 minutes of lack-of-speech happening.
- Text received from speech-recognition is sent to the Chat plugin.
- Code the flag in Moose.exe Settings.txt
- Add tests of the flag around all places in C# that use cloud.
- And look at plugins: Translate, PrivateChat, Login, Chat, GeoLocation, Research results storage,
- Code Moose.exe to receive a message from cloud to disable the flag.
- A hard-to-hack message so hackers can’t be sending “disable” messages to my user base.
- A flag created in Settings.txt, that can turn off all calls to our Azure. If we detect someone abusing our cloud, we send a message to their Moose, turning off it’s cloud usage.
- <meta name=”MooseUI” content=”AllScripts AllStyles”/>
- Moose.xml, has codes for ‘en-US’, ‘es’,’pt-BR’ and ‘hi’ and a few others.
- Delete the unused windows. WelcomeWindow, GiftWindow, LoginWindow
- Don’t save at shutdown. It’s amazing how often Moose.xml is getting Saved currently, for no reason. Make it read-only.
- Move streams data into the Plugins/Streams folder. Save only when the plugin makes a change to values, not at shutdown.
- Move Moose3DStartupInterval and AutoStartupDelay into a file in the AutoStartup folder, save only when the plugin makes a change to the values, not save at shutdown.
- Twitter API limits, the C# calls to twitter must count calls in 15-minute windows,
- and block excess, so we don’t get banned by Twitter.
- The plugin’s Shutdown function also tries to reset timing of 1 minute or less, to longer values.
- Streams with only 2 plugins set, should use my Alternate12(), and with 3 plugins set, should use Alternate123() instead of Random(1,2) or Random(1,3).
- I found that I prefer the predictable evenness, over the sometimes occurrence of getting the same plugin 3 times in a row.
- It will solve a problem, of wanting to hear 2 “evening” plugins, once each.
- Alternate1234, maybe even Alternate12345
- But I and Beta users would lose access to making video captures.
- Ivan, why is this necessary? Isn’t hiding almost as good?
- Remove access to Moose Studio, for the version to go out for beta testing.
- Moose.SetVideoRenderBackgroundImage( theURL );
- I need the ability to change the background image for video captures, automated within Plugins.
- To eliminate the clumsy visit into Moose Studio to change the image, and normal users won’t get access to Moose Studio.
- So a plugin can automatically use a random different image each time, or slide to choose a desired image.
- Able to use background image from local, or from a URL. 2 functions?
- (below, are not urgent priorities right now. they are future ideas.
- This might be useful to the Meme Maker code, if it can set the background image to be fully transparent.
- It would be great to have code that automatically responds to facebook mentions of the Moose, by creating Meme-like static pictures, OR, rendered videos, with automatically generated text,
and posting them to facebook. Would be good for marketing. Could make Happy birthday videos for all my registered users. - In the further future, ability to render onto a background video
- Moose.Record(‘these words’) will be needed too.
- I need the ability to change the background image for video captures, automated within Plugins.
- Chat in my-custom-functions.php improvements.
- GreenSock + Scrollmagic for sliding animations of chats
- Hover popup over moose saying ‘click’ for joke
- Circle pictures to add box-shadow 50% radius
- Circle pictures bounce animation when clicked, ie,
- improve pulseClick and hopefully not have it disturb the position of anything else.
- Mimic the bounce of Say Joke style of buttons in Home.html
- Circle pictures to show cursor:pointer
- Ad footer code
- update Facebook to 2.11 version
- serve the .js from moosefile instead of halls.md
- Add some animation to text in the ad
- Hotkey for Moose3D.exe to capture a Moose image (in big size, high resolution) and save it into a PNG format with alpha transparency shadow. To be subsequently used for creating sellable Moose products on zazzle.
- Probably need several sizes, big and small, because eyelashes look bad after downscaling.
- I don’t know the sizes needed yet, so an editable setting for sizes, would be nice.
- (I tried using WebMoose output in Photoshop, but couldn’t figure out how to use it to create the transparent background PNGs that I need.)
- for Meme Maker and for creating Products for sale
- Allow a plugin to have no javascript, ie, an empty <source>
- Fix to automatically use the email address obtained from Facebook.
- subject used if source also present, for email subject.
- Forwarding to Email and IFTTT, if the Moose can’t speak a message.
- {“andIFTTT”:”eventname”}. ( {“orIFTTT”:”eventname”} ). (for WebHooks API)
- Later add {“andZapier”:”triggerURL”} or {“orZapier”:”triggerURL”} because Zapier is very awesome.
- For Toast style notifications
- Ability to toggle the windowframe from our standard, to slim ( Although, the frame with 3D text shadows is starting to look good, so this is lower priority.
- Commands to position the window offscreen, to various corners. ( But bouncing to land above the taskbar is probably going to be good, so this is lower priority)
- Ivan’s mouse gestures apparently don’t work
- They don’t match the example in “About the Moose”
- Waiting for help with chatbot coding. It should be a dedicated max effort, not dabbling.
- Chat.js Azure refresh token, should keep track of last time something was chatted, and stop refreshing the token if > 20 minutes has passed. Clear instead.
- At Shutdown, Moose says goodbye, the green points window gets frozen.
- So, disable the green points display for the final goodbye speaking.
- For Toast style notifications
- Ivan suggested using Moose3D to do the sliding motions of the window.
- Hiding choppy animation, perhaps add slight delay from signal to motion.
- A command to interrupt a Notification.Hide(), so it reverses back to fully shown. ( Notification.Hide(‘reverse’); ???
- The Notification.Show() to add parameters for height and width, in pixels,
that fit whatever the HTML believes are pixels. - For Notification.Show(), can the $(window).load function determine the actual height of internal content, and then adjust the window height to fit, and adjust the bounce onto top of taskbar accordingly. Is C# able to handle that, or must the <script> call a C# function to adjust the window height and bounce?
- At the office PC, mysteriously, font sizes seem Zoomed, and manual un-zooming doesn’t persist across sessions. Causes problem, fonts are too big and they don’t fit the available window space.
- When an HTML view is window Minimized, Restored, adjust the JS code in abc/Scripts/12_Pastels.js to halt gradient changing.
- A minimize from a taskbar click doesn’t succeed, so the Deactivate event is untrue and needs to be double-checked before telling plugins incorrect info.
- Periodic checking if monitors are added or unplugged.
- Allow moose recordings with Moose Location X and Moose Location Y to have negative number offsets.
- (PROBABLY FIXED) When opening “Open View” windows for plugins, add code that forces them to be smaller than the monitor they are on. I get problems, because my monitor #1 at home is landscape, my monitor #1 at the office is portrait mode. Sometimes, I Open View at home, and I can’t see the top or bottom window frame bars, which makes it very tricky to re-size them to be usable. I also discovered, that if I resize an “Open View” window for a plugin, then Close it, it will only save it’s new dimensions, if it was resized on monitor #1. It ignores my re-sizing on monitors #2 and #3.<- that seems weird behavior that will confuse users. We might have Beta testers who can’t close html views, because I saved them too large on my PC.
- ScrollWheel UpDownUp gesture. Scrollwheel coding
- When Plugin.SetStream(null) is used, and it falls-back to using Scheduler Intervals, make sure it restarts a waiting timer and doesn’t generate a Run after 0 milliseconds. It needs to be a proper wait Interval before Run.
- (PROBABLY FIXED) this error is just logging something.
- When Voice is male, switch texture map of face and eyelashes to be the male version.
- If I’m working on Moose, testing phrases in plugins, and if it’s after midnight, then Quiet Hours happens, and makes it seem like the plugin isn’t working.
- We should give some visual feedback, flashing the plugin taskbar icon, perhaps with something like a symbol of audio being off. I can supply an audio-if-off symbol to flash, when you are ready.
- For all Streams (Minutes Channel, Hours, etc)
- (I’m having second thoughts about this one.. maybe not needed right now). to have a setting to allow 1 or 2 things spoken each time. Therefore, I need a setting to specify “intervals/once(1)/once(2)/twice(1)/twice(2). “Once(1) would mean afternoon would only speak once, just one plugin. Once(2) would mean afternoon would speak once, but sentences from 2 plugins one-after-another. Twice(1) would mean speak once then wait for the interval to pass then speak one more time, a sentence from one plugin. Twice(2) would be speak two sentences from two plugins each time, for a total of 4 in the afternoon.
- (I’m having second thoughts about this one.. maybe not needed right now)the Duration, if null, currently means it’s a 24-hour-a-day channel. I need a separate setting meaning Duration24hourAdayOnOff, to put into a toggle button. This will allow a numeric Duration value (non-null) to not get lost if the user toggles 24-hour-a-day on and off.
- (Ivan wanted to wait on security bulletproofing. I hope my good ideas about setting limits and length-checking parameters isn’t forgotten.)
- Idea to add deliberate slowdown to cloud functions involving user_ids or secret tokens, to thwart brute forcing.
- Idea to check IP address stored with user_ID, and email or alert if new IP addresses suddenly appear.
- Need a way to store pronounciation errors. Perhaps in a filter plugin? I’ve remembered that /abc/VoiceRules.js gets called before the Moose generates animation. Maybe something similar can be implemented for pronouncication.. Ie, some Voice companies might allow embedded pronounciation, others might need different methods.
- Fix “quite a few items to fix with recording on Moose.exe”.
- Shh’ing and Cancelling recording, would cause errors. Need to fix this.
- Moose can send Visemes while recording, which would put Show/Hide Moose commands out of order.
- Stop recording button ignores part of the recording process and sends MMF messages directly to Moose3D without calling Speech or Animation services.
- A brief flash of the Moose, after recording ends.
- If a plugin has an error, you currently disable it, until the next restart of the Moose. That’s OK for active developers, but for normal users, I think we should show a one-time message on the next restart, saying it was disabled and would you like to re-enable it?
- If a plugin causes Moose.exe to CRASH or EXIT silently, we should show a one-time message on the next restart, saying the plugin was disabled, and would you like to re-enable it.
- The javascript error dialogs, I can’t change the size of the window frame. I’d like to be able to play with that.
- Need new webmoose code, so it works also on mobile browsers. For my website
- In a plugins .html file, if I use <form>…</form> it causes an error after clicking a button. Maybe it’s trying to do an ‘action’ like ‘get’ or ‘put’.
- I think there are forms in the Streams.html. I should check if they error.
- The Green windows, for the X, -, and wrench buttons, they need to have hover and click effects.
- Shh’ing twice. The VB6 moose had a feature, if you SHH’ed 2 things in a row, then it would keep the Moose silent for 30 minutes. If the user SHH’es the first thing spoken after 30 minutes, then it won’t speak again for 2 hours.
- Watching a Movie, Playing a game, YES, I’ve always intended to have a feature, a list of processes, such that if that process is running, the Moose will keep silent. We’d supply a decent list, and be able to update it remotely, and learn what other users are adding to their custom lists.
- Stimulus sound, Probably later, a feedback method: a Right-Left gesture after hearing the stimulus sound, could be a way of teaching the Moose, that the stimulus interval was annoying and needs to be lengthened longer than 10 minutes, and maybe we automatically increase it to 15 minutes.
- Earning badges. Float up a little symbol of a badge earned, and store it someplace where people can look at them later. ( this is an idea for later. Don’t code badges now. I just don’t want to forget it.)
- Quiet Hours improvement. Ideas.
- Quiet doesn’t start until there is about 5 minutes of inactivity of keyboard and mouse movement.
- It can wake-up during the Quiet hours, if keyboard happens, or if mouse moves more than 20 pixels in 1 sec (ie, not slow gradual drift).
- Moose.Quiet.temporarilyTalkingBecauseOfActivity.
- Quiet Hours is supposed to be suspended, when there is computer activity, typing or mouse movement. it should audibly talk. But I think it rarely works, maybe never.
- When it does get working again, I’d like to show some feedback about this status, in the Quiet Hours plugin.
- This will be important feedback so users will understand WHY the moose is still talking after they just turned Quiet mode ON.
- I’d like to reward Button clicks inside plugins, with random bonus game points. Like, clicking “Say anti-anxiety”, or “Say weight-loss” buttons. But how?, I don’t want a public function visible inside Javascript that could be run in a loop. Maybe we can automate it. If an HTML plugin page has a button that calls Moose.Run, then the Run() gets Plugin.RunType == “Action”. Perhaps we can do a Bonus points if Run() calls Moose.Say(), maybe show those points even before the speech queue starts talking. It will probably need some time limits, or maybe it won’t become active again until after a moose Say is completed.
- I’m wondering if the Green window for game points, if it should be javascript on HTML. Then I could use GreenSock for moving things, animating SVGs, clipping it so the sys tray shows.. But what would happen to the beautiful fonts?
- Try seeing +48 Bonus Points float up as soon as the gesture succeeds, instead of waiting till the end of speaking.
- It would probably be more encouraging that way.
- When making a recording, sometimes the Moose tries to speak something that just happens through normal timing, and it messes up the end of the recording, so a huge recording of idle motions happens, which then chokes the file system.
- We need a flag to disable regular talking until recording is fully over.
- We need a flag to disable recording until regular talking is over.
- (This is similar to disabling talking until auto-saving is over.
- Plugin HTML view windows are supposed to toggle between minimize and show, when you click on their taskbar name. It opens correctly, but doesn’t minimize correctly when the taskbar is clicked again.
- Ivan says it’s because our View .html windows are actually 2 windows superimposed, one for the frame, the other for the web browser content. To fix this, would require some low level OS hooks and messing with OS messages.
Ivan’s servers
Ivan says: I do have bunch of space on my servers now that we can use. Got stable 1Gb line as well, all battery protected; internet, servers, networks etc…
Servers can do everything we want. But I was thinking more like for extra features, database proxy kinda deal for external IPs like IP Lookup, to save money. And some features just don’t work nicely on the Cloud, money wise, for example if we want to proxy WebRequests we need tons of storage and big chunks to store in database (web page caching), which will cost a lot on the Cloud.
And just in general if (when) we grow Cloud cost will be huge, it’s $1/m per user account just for authentication (first 10k are free), oh actually no it was on AWS, it’s just $ 0.0011 per user per month and $0.0028 per authentication per month (not quite sure what it actually mean, looks like it’s per authentication request but why “per month”). Anyhow cost can go nuts and I like to have a backup plan.
All Azure code I wrote is directly portable to on-premises servers (by design) and we can do hybrids – some stuff runs on Azure and some on our own servers.
Stale Ideas
- Ivan says it’s difficult for detecting if Moose.IsInternetAvailable, so I’ll have to just accept that plugins will show the not-logged-in warning, if there’s no internet.
- Making recordings. I’m using Bandicam now, so I don’t think built-in recording is a needed feature anymore.
- Home.html doesn’t show up if I start Moose with my VPN running, until a 5-minute timeout elapses. Can you shorten that to 15 seconds?
- Not working, need fix: this.getResponseHeader(“Last-Modified”); and this.getAllResponseHeaders(); But I’m unlikely to use it in my WebRequest plugin.
- Does Translate API on cloud have any Throttling, or overuse protection? We need something, perhaps count uses per minute.Ivan says Azure only gives a daily limit. I was thinking our own code on Azure would count on a per-user basis, to a max per minute.
- Moose.SendWebHook(theJSON) might be better than plain XmlHttpRequestFor improving PrivateChat.js function SendPrivateChat
- WebMoose, for BMI results, give thought for a way to speak different sentences for BMI of 29.1, 29.3 etc..Perhaps a webhook to a plugin that creates mp4 recordings, and sends them back.
I should write down the sub-steps to make this happen. But not code it yet. - Twitter real-time Streaming.For a new tab in the Twitter.html options bar.
It would show scrolling text results of the incoming stream, (not using Buffer), used for reading it, not Moose speaking it.
https://developer.twitter.com/en/docs/tweets/filter-realtime/overview
https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/connecting - Ivan wants to avoid Lip Sync delay on the first “Hello” for a new user on a slow computer. My idea was to have Home.html send an event, when it’s finished loading. I think this can wait until after we give it to our trusted friends to try it.
- Back button, for plugin windows.If the plugin designer chooses to place a link to a webpage, and that webpage is displayed in our green window, we need BACK navigation, somehow.
We don’t have a visible button on the frame, Can we add one?
At least we should act upon the keyboard press for going back, which is? ESC, or ALT-Left-arrow? - Need a checkbox option for Moose startup, to not show Home.html in the taskbar at all.Ie, have it only accessible through the right-click systray.
This would be an advanced-user option.
I guess it needs a Get and Set function available in javascript and html - Optional, I’ve never had confidence to use the “RELOAD” feature, but maybe creating a C# function for Plugin.ReloadJS(), it could be put on a button in the Plugin.html, for testing things.
- Code Moose.exe to receive a command code from cloud, to report back it’s version and maybe checksums.This could grow into a generic command for Moose.exe to send back all sorts of info upon request.
Not needed for beta test, but could be useful later. - Code Moose.exe to receive a command code from cloud, to cause this Moose to retire. When a Moose version is too old, no longer supported, maybe failing to auto-update, it needs to be “retired”, with a sweet message of regret, and advice to get new version.
My retirement funds are at risk. I am at legal risk. If some unforeseen lawsuit told me to shut it all down, I need a way. - More APIs, slightly less priority, may not get into Beta testThen Zazzle, (according to their API, my associate ID is 238195250472598764When I sign on with Facebook, my associate id is 238195250472598764
Then SendTxt plugin uses Nexmo API. (ApiKey and ApiSecret)
Then YouTube API, currently visible in YouTube.js line 403
For Zazzle API, “Something to keep me busy for a while”, the C# function for using Template links:The documentation.
Because javascript can’t read the zazzle RSS feed, due to CORS block, need a PHP or Lambda task on AWS that fetches the RSS feeds, converts it into JSON files.
My Associate ID should be in the C# function. It is 238195250472598764
Maybe my associate ID is stored on the cloud, not hard-coded into Moose.exe, in case I ever need to create a new company or bank account for this zazzle stuff, without needing to do a Moose.exe update.
So the protected part of the C# URL is “https://www.zazzle.com/api/create/at-238195250472598764?rf=238195250472598764
And everything else is a query parameter that Javascript can create and pass as a single string parameter.
The Images of the Moose, to be put on Mugs and Shirts, need to be on a specific domain or subdomain, like images.moosefile.com
We also need a C# function for using “RealView Template links. They are for <img src=…> and the src URL needs to contain my associate ID.Maybe we need a C# function that simply returns my associate ID. Then Javascript can create the rest of the src URL in a string.
But plugin views are difficult at showing made-by-javascript image sources, at least for local files. There were tricks needed with @file: to set theElement.src = theURL. Maybe it’s not a problem for external URLs. - Ivan suggested to move the TTS for audible speech, into Moose3D.exe, but keep TTS in C# for the silent run that preceeds it.Hoping to eliminate lip-sync problems.
- Microphone for arbitrary lip-sync.need multiple arrays filled with data, raw and from FFT, lots of sums, 256,128,64,32,16,8,4. and at at least 8 different time windows, probably more. Combining enough to get average of 20ms, 40ms and 80ms worth of speech.
The FFT size, 512 size.
Microphone notes.ReasonsUser talks into microphone, Moose mimics the correct mouth shapes, a “fun mode”, lets people record the Moose singing, or speaking sounding sad or mad or excited.
Steve will need a way to visualize the spectrograms, at various summated amounts, at various time-averaged amounts, and compare 2 sounds.We will need to build a visualization tool, in order to efficiently analyze a few thousand different sound samples, while coding the logic.
Steves examples of Formant code: aescripts.com auto-lip-sync or Talking Head by Ryan Cashman, both for Adobe AfterEffects, A Mathworks module: https://www.mathworks.com/matlabcentral/fileexchange/45315-formant-estimation, http://geoff-morrison.net/ has a matlab source code for formants, near bottom of page. - Microsoft Azure, I can find the Verbs using https://westus.dev.cognitive.microsoft.com/docs/services/56ea598f778daf01942505ff/operations/56ea5a1cca73071fd4b102bb
- mail.halls.md added to certificate.Install to all places, halls.md breast-cancer.ca, Azure, etc
But look into why your visestech is rejecting my emails as spam. Maybe I shouldn’t get deeply serious about mail.halls.md if some people will be blocked from receiving my emails.
Defer this item, until I eventually learn which SpamHaus-like service is actually blocking me. Maybe outlook?
Notes about Notifications
Because notifications on the Windows 10 desktop are not very useful, and could be enhanced by having the Moose speak them sometimes.
Regarding hooking into Notifications in win10, according to a freelancer yassineAzxmani, using ApiMonitor, this graphic shows that Notifications are located in ntdll.dll, and use a thread with CSRSS. And that suggests it may not be possible to inject into that.
Here’s an alternate hook library. It’s very unlikely the Moose will ever hook things directly, because I want a perfect reputation. But add-on products with their own DLLs could still be possible.PolyHook Hook library