diff --git a/.gitignore b/.gitignore index 08cb523..b209f4e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ go.sum +vail diff --git a/static/fortune.mjs b/static/fortune.mjs deleted file mode 100644 index f19b6a5..0000000 --- a/static/fortune.mjs +++ /dev/null @@ -1,35 +0,0 @@ -import * as Morse from "./morse.mjs" - -class Fortune { - constructor() { - let button = document.querySelector("#fortune") - button.addEventListener("click", () => this.go()) - this.buzzer = new Morse.Buzzer({highFreq: 440}) - this.iambic = new Morse.Iambic(() => this.buzzer.Buzz(true), () => this.buzzer.Silence(true)) - document.querySelector("#iambic-duration").addEventListener("input", e => this.iambic.SetIntervalDuration(e.target.value)) - } - - async go() { - let resp = await fetch("https://rot47.net/api/fortune/") - let fortune = await resp.json() - this.iambic.EnqueueAsciiString(fortune) - } - - -} - -function fortuneInit() { - try { - window.fortune = new Fortune() - } catch (err) { - console.log(err) - Morse.toast(err) - } -} - - -if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", fortuneInit) -} else { - fortuneInit() -} diff --git a/static/fortunes.mjs b/static/fortunes.mjs new file mode 100644 index 0000000..a1a18ec --- /dev/null +++ b/static/fortunes.mjs @@ -0,0 +1,467 @@ +/* +These were converted, and lightly edited, from the `fortunes-min` Debian package, +which came with the following copyright: + + +Copyright (c) 1991 The Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. [ Deleted. see :- + ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change + ] +4. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +export const fortunes = [ + "A day for firm decisions! Or is it?", + "A few hours grace before the madness begins again.", + "A gift of a flower will soon be made to you.", + "A long-forgotten loved one will appear soon. Buy the negatives at any price.", + "A tall, dark stranger will have more fun than you.", + "A visit to a fresh place will bring strange work.", + "A visit to a strange place will bring fresh work.", + "A vivid and creative mind characterizes you.", + "Abandon the search for Truth; settle for a good fantasy.", + "Accent on helpful side of your nature. Drain the moat.", + "Advancement in position.", + "After your lover has gone you will still have PEANUT BUTTER!", + "Afternoon very favorable for romance. Try a single person for a change.", + "Alimony and bribes will engage a large share of your wealth.", + "All the troubles you have will pass away very quickly.", + "Among the lucky, you are the chosen one.", + "An avocado-tone refrigerator would look good on your resume.", + "An exotic journey in downtown Newark is in your future.", + "Another good night not to sleep in a eucalyptus tree.", + "Are you a turtle?", + "Are you ever going to do the dishes? Or will you change your major to biology?", + "Are you making all this up as you go along?", + "Are you sure the back door is locked?", + "Artistic ventures highlighted. Rob a museum.", + "Avert misunderstanding by calm, poise, and balance.", + "Avoid gunfire in the bathroom tonight.", + "Avoid reality at all costs.", + "Bank error in your favor. Collect $200.", + "Be careful! Is it classified?", + "Be careful! UGLY strikes 9 out of 10!", + "Be cautious in your daily affairs.", + "Be cheerful while you are alive. -- Phathotep, 24th Century B.C.", + "Be different: conform.", + "Be free and open and breezy! Enjoy! Things won't get any better so get used to it.", + "Be security conscious -- National defense is at stake.", + "Beauty and harmony are as necessary to you as the very breath of life.", + "Best of all is never to have been born. Second best is to die soon.", + "Better hope the life-inspector doesn't come around while you have your life in such a mess.", + "Beware of a dark-haired man with a loud tie.", + "Beware of a tall black man with one blond shoe.", + "Beware of a tall blond man with one black shoe.", + "Beware of Bigfoot!", + "Beware of low-flying butterflies.", + "Beware the one behind you.", + "Blow it out your ear.", + "Break into jail and claim police brutality.", + "Bridge ahead. Pay troll.", + "Caution: breathing may be hazardous to your health.", + "Caution: Keep out of reach of children.", + "Celebrate Hannibal Day this year. Take an elephant to lunch.", + "Change your thoughts and you change your world.", + "Cheer Up! Things are getting worse at a slower rate.", + "Chess tonight.", + "Chicken Little only has to be right once.", + "Chicken Little was right.", + "Cold hands, no gloves.", + "Communicate! It can't make things any worse.", + "Courage is your greatest present need.", + "Day of inquiry. You will be subpoenaed.", + "Do not overtax your powers.", + "Do not sleep in a eucalyptus tree tonight.", + "Do nothing unless you must, and when you must act -- hesitate.", + "Do something unusual today. Pay a bill.", + "Do what comes naturally. Seethe and fume and throw a tantrum.", + "Domestic happiness and faithful friends.", + "Don't feed the bats tonight.", + "Don't get stuck in a closet -- wear yourself out.", + "Don't get to bragging.", + "Don't go surfing in South Dakota for a while.", + "Don't hate yourself in the morning -- sleep till noon.", + "Don't kiss an elephant on the lips today.", + "Don't let your mind wander -- it's too little to be let out alone.", + "Don't look back, the lemmings are gaining on you.", + "Don't look now, but the man in the moon is laughing at you.", + "Don't look now, but there is a multi-legged creature on your shoulder.", + "Don't plan any hasty moves. You'll be evicted soon anyway.", + "Don't read any sky-writing for the next two weeks.", + "Don't read everything you believe.", + "Don't relax! It's only your tension that's holding you together.", + "Don't tell any big lies today. Small ones can be just as effective.", + "Don't worry so loud, your roommate can't think.", + "Don't Worry, Be Happy. -- Meher Baba", + "Don't you feel more like you do now than you did when you came in?", + "Don't you wish you had more energy... or less ambition?", + "Everything that you know is wrong, but you can be straightened out.", + "Everything will be just tickety-boo today.", + "Excellent day for putting Slinkies on an escalator.", + "Excellent day to have a rotten day.", + "Excellent time to become a missing person.", + "Executive ability is prominent in your make-up.", + "Exercise caution in your daily affairs.", + "Expect a letter from a friend who will ask a favor of you.", + "Expect the worst, it's the least you can do.", + "Fine day for friends. So-so day for you.", + "Fine day to work off excess energy. Steal something heavy.", + "Future looks spotty. You will spill soup in late evening.", + "Generosity and perfection are your everlasting goals.", + "Give him an evasive answer.", + "Give thought to your reputation. Consider changing name and moving to a new town.", + "Give your very best today. Heaven knows it's little enough.", + "Go to a movie tonight. Darkness becomes you.", + "Good day for a change of scene. Repaper the bedroom wall.", + "Good day for overcoming obstacles. Try a steeplechase.", + "Good day to deal with people in high places; particularly lonely stewardesses.", + "Good day to let down old friends who need help.", + "Good news from afar can bring you a welcome visitor.", + "Good news. Ten weeks from Friday will be a pretty good day.", + "Good night to spend with family, but avoid arguments with your mate's new lover.", + "Green light in A.M. for new projects. Red light in P.M. for traffic tickets.", + "Hope that the day after you die is a nice day.", + "If you can read this, you're too close.", + "If you learn one useless thing every day, in a single year you'll learn 365 useless things.", + "If you sow your wild oats, hope for a crop failure.", + "If you stand on your head, you will get footprints in your hair.", + "If you think last Tuesday was a drag, wait till you see what happens tomorrow!", + "If your life was a horse, you'd have to shoot it.", + "In the stairway of life, you'd best take the elevator.", + "Increased knowledge will help you now. Have mate's phone bugged.", + "Is that really YOU that is reading this?", + "Is this really happening?", + "It may or may not be worthwhile, but it still has to be done.", + "It was all so different before everything changed.", + "It's all in the mind, ya know.", + "It's lucky you're going so slowly, because you're going in the wrong direction.", + "Just because the message may never be received does not mean it is not worth sending.", + "Just to have it is enough.", + "Keep emotionally active. Cater to your favorite neurosis.", + "Keep it short for pithy sake.", + "Lady Luck brings added income today. Lady friend takes it away tonight.", + "Learn to pause -- or nothing worthwhile can catch up to you.", + "Let me put it this way: today is going to be a learning experience.", + "Life is to you a dashing and bold adventure.", + "Live in a world of your own, but always welcome visitors.", + "Living your life is a task so difficult, it has never been attempted before.", + "Long life is in store for you.", + "Look afar and see the end from the beginning.", + "Love is in the offing. Be affectionate to one who adores you.", + "Make a wish, it might come true.", + "Many changes of mind and mood; do not hesitate too long.", + "Never be led astray onto the path of virtue.", + "Never commit yourself! Let someone else commit you.", + "Never give an inch!", + "Never look up when dragons fly overhead.", + "Never reveal your best argument.", + "Next Friday will not be your lucky day. As a matter of fact, you don't have a lucky day this year.", + "Of course you have a purpose -- to find a purpose.", + "People are beginning to notice you. Try dressing before you leave the house.", + "Perfect day for scrubbing the floor and other exciting things.", + "Questionable day. Ask somebody something.", + "Reply hazy, ask again later.", + "Save energy: be apathetic.", + "Ships are safe in harbor, but they were never meant to stay there.", + "Slow day. Practice crawling.", + "Snow Day -- stay home.", + "So this is it. We're going to die.", + "So you're back... about time...", + "Someone is speaking well of you.", + "Someone is speaking well of you. How unusual!", + "Someone whom you reject today, will reject you tomorrow.", + "Stay away from flying saucers today.", + "Stay away from hurricanes for a while.", + "Stay the curse.", + "That secret you've been guarding, isn't.", + "The time is right to make new friends.", + "There is a 20% chance of tomorrow.", + "There is a fly on your nose.", + "There was a phone call for you.", + "There will be big changes for you but you will be happy.", + "Things will be bright in P.M. A cop will shine a light in your face.", + "Think twice before speaking, but don't say \"think think click click\".", + "This life is yours. Some of it was given to you; the rest, you made yourself.", + "This will be a memorable month -- no matter how hard you try to forget it.", + "Time to be aggressive. Go after a tattooed Virgo.", + "Today is National Existential Ennui Awareness Day.", + "Today is the first day of the rest of the mess.", + "Today is the first day of the rest of your life.", + "Today is the last day of your life so far.", + "Today is the tomorrow you worried about yesterday.", + "Today is what happened to yesterday.", + "Tomorrow will be cancelled due to lack of interest.", + "Tomorrow, this will be part of the unchangeable past but fortunately, it can still be changed today.", + "Tomorrow, you can be anywhere.", + "Tonight you will pay the wages of sin; Don't forget to leave a tip.", + "Tonight's the night: Sleep in a eucalyptus tree.", + "Troubled day for virgins over 16 who are beautiful and wealthy and live in eucalyptus trees.", + "Truth will out this morning. (Which may really mess things up.)", + "Try the Moo Shu Pork. It is especially good today.", + "Try to get all of your posthumous medals in advance.", + "Try to have as good a life as you can under the circumstances.", + "Try to value useful qualities in one who loves you.", + "Tuesday After Lunch is the cosmic time of the week.", + "Tuesday is the Wednesday of the rest of your life.", + "What happened last night can happen again.", + "While you recently had your problems on the run, they've regrouped and are making another attack.", + "Write yourself a threatening letter and pen a defiant reply.", + "You are a bundle of energy, always on the go.", + "You are a fluke of the universe; you have no right to be here.", + "You are a very redundant person, that's what kind of person you are.", + "You are always busy.", + "You are as I am with You.", + "You are capable of planning your future.", + "You are confused; but this is your normal state.", + "You are deeply attached to your friends and acquaintances.", + "You are destined to become the commandant of the fighting men of the department of transportation.", + "You are dishonest, but never to the point of hurting a friend.", + "You are fairminded, just and loving.", + "You are farsighted, a good planner, an ardent lover, and a faithful friend.", + "You are fighting for survival in your own sweet and gentle way.", + "You are going to have a new love affair.", + "You are magnetic in your bearing.", + "You are not dead yet. But watch for further reports.", + "You are number 6! Who is number one?", + "You are only young once, but you can stay immature indefinitely.", + "You are scrupulously honest, frank, and straightforward. Therefore you have few friends.", + "You are sick, twisted and perverted. I like that in a person.", + "You are so boring that when I see you my feet go to sleep.", + "You are standing on my toes.", + "You are taking yourself far too seriously.", + "You are the only person to ever get this message.", + "You are wise, witty, and wonderful, but you spend too much time reading this sort of trash.", + "You attempt things that you do not even plan because of your extreme stupidity.", + "You can create your own opportunities this week. Blackmail a senior executive.", + "You can do very well in speculation where land or anything to do with dirt is concerned.", + "You can rent this space for only $5 a week.", + "You could live a better life, if you had a better mind and a better body.", + "You definitely intend to start living sometime soon.", + "You dialed 5483.", + "You display the wonderful traits of charm and courtesy.", + "You don't become a failure until you're satisfied with being one.", + "You enjoy the company of other people.", + "You feel a whole lot more like you do now than you did when you used to.", + "You fill a much-needed gap.", + "You get along very well with everyone except animals and people.", + "You had some happiness once, but your parents moved away, and you had to leave it behind.", + "You have a deep appreciation of the arts and music.", + "You have a deep interest in all that is artistic.", + "You have a reputation for being thoroughly reliable and trustworthy. A pity that it's totally undeserved.", + "You have a strong appeal for members of the opposite sex.", + "You have a strong appeal for members of your own sex.", + "You have a strong desire for a home and your family interests come first.", + "You have a truly strong individuality.", + "You have a will that can be influenced by all with whom you come in contact.", + "You have an ability to sense and know higher truth.", + "You have an ambitious nature and may make a name for yourself.", + "You have an unusual equipment for success. Be sure to use it properly.", + "You have an unusual magnetic personality. Don't walk too close to metal objects which are not fastened down.", + "You have an unusual understanding of the problems of human relationships.", + "You have been selected for a secret mission.", + "You have Egyptian flu: you're going to be a mummy.", + "You have had a long-term stimulation relative to business.", + "You have literary talent that you should take pains to develop.", + "You have many friends and very few living enemies.", + "You have no real enemies.", + "You have taken yourself too seriously.", + "You have the body of a 19 year old. Please return it before it gets wrinkled.", + "You have the capacity to learn from mistakes. You'll learn a lot today.", + "You have the power to influence all with whom you come in contact.", + "You like to form new friendships and make new acquaintances.", + "You look like a million dollars. All green and wrinkled.", + "You look tired.", + "You love peace.", + "You love your home and want it to be beautiful.", + "You may be gone tomorrow, but that doesn't mean that you weren't here today.", + "You may be infinitely smaller than some things, but you're infinitely larger than others.", + "You may be recognized soon. Hide.", + "You may get an opportunity for advancement today. Watch it!", + "You may worry about your hair-do today, but tomorrow much peanut butter will be sold.", + "You need more time; and you probably always will.", + "You need no longer worry about the future. This time tomorrow you'll be dead.", + "You never hesitate to tackle the most difficult problems.", + "You never know how many friends you have until you rent a house on the beach.", + "You now have Asian Flu.", + "You own a dog, but you can only feed a cat.", + "You plan things that you do not even attempt because of your extreme caution.", + "You possess a mind not merely twisted, but actually sprained.", + "You prefer the company of the opposite sex, but are well liked by your own.", + "You recoil from the crude; you tend naturally toward the exquisite.", + "You seek to shield those you love and you like the role of the provider.", + "You shall be rewarded for a dastardly deed.", + "You should emulate your heroes, but don't carry it too far. Especially if they are dead.", + "You should go home.", + "You single-handedly fought your way into this hopeless mess.", + "You teach best what you most need to learn.", + "You too can wear a nose mitten.", + "You two ought to be more careful--your love could drag on for years and years.", + "You will always get the greatest recognition for the job you least like.", + "You will always have good luck in your personal affairs.", + "You will attract cultured and artistic people to your home.", + "You will be a winner today. Pick a fight with a four-year-old.", + "You will be advanced socially, without any special effort on your part.", + "You will be aided greatly by a person whom you thought to be unimportant.", + "You will be attacked by a beast who has the body of a wolf, the tail of a lion, and the face of Donald Duck.", + "You will be audited by the Internal Revenue Service.", + "You will be awarded a medal for disregarding safety in saving someone.", + "You will be awarded some great honor.", + "You will be awarded the Nobel Peace Prize... posthumously.", + "You will be called upon to help a friend in trouble.", + "You will be divorced within a year.", + "You will be given a post of trust and responsibility.", + "You will be held hostage by a radical group.", + "You will be honored for contributing your time and skill to a worthy cause.", + "You will be imprisoned for contributing your time and skill to a bank robbery.", + "You will be married within a year, and divorced within two.", + "You will be married within a year.", + "You will be misunderstood by everyone.", + "You will be recognized and honored as a community leader.", + "You will be reincarnated as a toad; and you will be much happier.", + "You will be run over by a beer truck.", + "You will be run over by a bus.", + "You will be singled out for promotion in your work.", + "You will be successful in love.", + "You will be surprised by a loud noise.", + "You will be surrounded by luxury.", + "You will be the last person to buy a Chrysler.", + "You will be the victim of a bizarre joke.", + "You will be Told about it Tomorrow. Go Home and Prepare Thyself.", + "You will be traveling and coming into a fortune.", + "You will be winged by an anti-aircraft battery.", + "You will become rich and famous unless you don't.", + "You will contract a rare disease.", + "You will engage in a profitable business activity.", + "You will experience a strong urge to do good; but it will pass.", + "You will feel hungry again in another hour.", + "You will forget that you ever knew me.", + "You will gain money by a fattening action.", + "You will gain money by a speculation or lottery.", + "You will gain money by an illegal action.", + "You will gain money by an immoral action.", + "You will get what you deserve.", + "You will give someone a piece of your mind, which you can ill afford.", + "You will have a long and boring life.", + "You will have a long and unpleasant discussion with your supervisor.", + "You will have domestic happiness and faithful friends.", + "You will have good luck and overcome many hardships.", + "You will have long and healthy life.", + "You will hear good news from one you thought unfriendly to you.", + "You will inherit millions of dollars.", + "You will inherit some money or a small piece of land.", + "You will live a long, healthy, happy life and make bags of money.", + "You will live to see your grandchildren.", + "You will lose your present job and have to become a door to door mayonnaise salesman.", + "You will meet an important person who will help you advance professionally.", + "You will never know hunger.", + "You will not be elected to public office this year.", + "You will obey or molten silver will be poured into your ears.", + "You will outgrow your usefulness.", + "You will overcome the attacks of jealous associates.", + "You will pass away very quickly.", + "You will pay for your sins. If you have already paid, please disregard this message.", + "You will pioneer the first Martian colony.", + "You will probably marry after a very brief courtship.", + "You will reach the highest possible point in your business or profession.", + "You will receive a legacy which will place you above want.", + "You will remember something that you should not have forgotten.", + "You will soon forget this.", + "You will soon meet a person who will play an important role in your life.", + "You will step on the night soil of many countries.", + "You will stop at nothing to reach your objective, but only because your brakes are defective.", + "You will triumph over your enemy.", + "You will visit the Dung Pits of Glive soon.", + "You will win success in whatever calling you adopt.", + "You will wish you hadn't.", + "You work very hard. Don't try to think as well.", + "You worry too much about your job. Stop it. You are not paid enough to worry.", + "You would if you could but you can't so you won't.", + "You'd like to do it instantaneously, but that's too slow.", + "You'll be called to a post requiring ability in handling groups of people.", + "You'll be sorry...", + "You'll feel devilish tonight. Toss dynamite caps under a flamenco dancer's heel.", + "You'll feel much better once you've given up hope.", + "You'll never be the man your mother was!", + "You'll never see all the places, or read all the books, but fortunately, they're not all recommended.", + "You'll wish that you had done some of the hard things when they were easier to do.", + "You're a card which will have to be dealt with.", + "You're almost as happy as you think you are.", + "You're at the end of the road again.", + "You're being followed. Cut out the hanky-panky for a few days.", + "You're currently going through a difficult transition period called \"Life.\"", + "You're definitely on their list. The question to ask next is what list it is.", + "You're growing out of some of your problems, but there are others that you're growing into.", + "You're not my type. For that matter, you're not even my species!", + "You're ugly and your mother dresses you funny.", + "You're working under a slight handicap. You happen to be human.", + "You've been leading a dog's life. Stay off the furniture.", + "Your aim is high and to the right.", + "Your aims are high, and you are capable of much.", + "Your analyst has you mixed up with another patient. Don't believe a thing he tells you.", + "Your best consolation is the hope that the things you failed to get weren't really worth having.", + "Your boss climbed the corporate ladder, wrong by wrong.", + "Your boss is a few sandwiches short of a picnic.", + "Your boyfriend takes chocolate from strangers.", + "Your business will assume vast proportions.", + "Your business will go through a period of considerable expansion.", + "Your depth of comprehension may tend to make you lax in worldly ways.", + "Your domestic life may be harmonious.", + "Your fly might be open (but don't check it just now).", + "Your heart is pure, and your mind clear, and your soul devout.", + "Your ignorance cramps my conversation.", + "Your life would be very empty if you had nothing to regret.", + "Your love life will be happy and harmonious.", + "Your love life will be... interesting.", + "Your lover will never wish to leave you.", + "Your lucky color has faded.", + "Your lucky number has been disconnected.", + "Your lucky number is 3552664958674928. Watch for it everywhere.", + "Your mode of life will be changed for the better because of good news soon.", + "Your mode of life will be changed for the better because of new developments.", + "Your motives for doing whatever good deed you may have in mind will be misinterpreted by somebody.", + "Your nature demands love and your happiness depends on it.", + "Your object is to save the world, while still leading a pleasant life.", + "Your own qualities will help prevent your advancement in the world.", + "Your present plans will be successful.", + "Your reasoning is excellent -- it's only your basic assumptions that are wrong.", + "Your reasoning powers are good, and you are a fairly good planner.", + "Your sister swims out to meet troop ships.", + "Your society will be sought by people of taste and refinement.", + "Your step will soil many countries.", + "Your supervisor is thinking about you.", + "Your talents will be recognized and suitably rewarded.", + "Your temporary financial embarrassment will be relieved in a surprising manner.", + "Your true value depends entirely on what you are compared with.", +] + +/** + * Return a randomly-chosen fortune. + */ +export function getFortune() { + return fortunes[Math.floor(Math.random() * fortunes.length)] +} diff --git a/static/index.html b/static/index.html index ad70aab..816a615 100644 --- a/static/index.html +++ b/static/index.html @@ -15,7 +15,6 @@ - @@ -176,15 +175,22 @@

- Check (CK) round-trip times and audio functionality - by sending "CK" to the repeater and playing the returned signal. + Send CK (check) to the repeater, and play when it comes back.

- Fetch a fortune and play it locally. - This can help practice copying (hearing) Morse code, - without having to involve another person. + Spacing: × + +

+

+ Have vail tell your fortune, in English. Local only: not transmitted.

@@ -323,7 +329,8 @@ 8 ---.. 9 ----.
- Over .-. + End of transmission .-.-. + Over -.- Correction ........ ? / Say Again ..--.. diff --git a/static/morse.mjs b/static/morse.mjs index 0f3ecfc..2db20ae 100644 --- a/static/morse.mjs +++ b/static/morse.mjs @@ -107,10 +107,11 @@ class Iambic { * @param {TxControl} endTxFunc Function to end transmitting * @param {number} intervalDuration Dit duration (milliseconds) */ - constructor(beginTxFunc, endTxFunc, intervalDuration=100) { + constructor(beginTxFunc, endTxFunc, {intervalDuration=100, pauseMultiplier=1}={}) { this.beginTxFunc = beginTxFunc this.endTxFunc = endTxFunc this.intervalDuration = intervalDuration + this.pauseMultiplier = pauseMultiplier this.ditDown = false this.dahDown = false this.last = null @@ -133,7 +134,11 @@ class Iambic { let next = this.queue.shift() if (next < 0) { - next = next * -1 + next *= -1 + if (next > 1) { + // Don't adjust spacing within a letter + next *= this.pauseMultiplier + } this.endTxFunc() } else { this.last = next @@ -166,6 +171,12 @@ class Iambic { return this.last } + /** + * Return true if we are currently playing out something + */ + Busy() { + return this.pulseTimer + } /** * Set a new dit interval (transmission rate) * @@ -175,6 +186,18 @@ class Iambic { this.intervalDuration = duration } + /** + * Set a new pause multiplier. + * + * This slows down the inter-letter and inter-word pauses, + * which can aid in learning. + * + * @param {number} multiplier Pause multiplier + */ + SetPauseMultiplier(multiplier) { + this.pauseMultiplier = multiplier + } + /** * Add to the output queue, and start processing the queue if it's not currently being processed. * @@ -204,12 +227,12 @@ class Iambic { } } - EnqueueAsciiString(s) { + EnqueueAsciiString(s, {pauseLetter = PAUSE_LETTER, pauseWord = PAUSE_WORD} = {}) { for (let c of s.toLowerCase()) { let m = MorseMap[c] if (m) { this.EnqueueMorseString(m) - this.Enqueue(PAUSE_LETTER) + this.Enqueue(pauseLetter) continue } @@ -217,7 +240,7 @@ class Iambic { case " ": case "\n": case "\t": - this.Enqueue(PAUSE_WORD) + this.Enqueue(pauseWord) break default: console.warn("Unable to encode '" + c + "'!") diff --git a/static/vail.mjs b/static/vail.mjs index 056605c..b6e8e01 100644 --- a/static/vail.mjs +++ b/static/vail.mjs @@ -1,4 +1,6 @@ import * as Morse from "./morse.mjs" +import {getFortune} from "./fortunes.mjs" +import { toast } from "./morse.mjs" class Vail { constructor() { @@ -29,12 +31,22 @@ class Vail { document.addEventListener("keyup", e => this.keyboard(e)) // Make helpers - this.iambic = new Morse.Iambic(() => this.beginTx(), () => this.endTx()) this.buzzer = new Morse.Buzzer() + this.iambic = new Morse.Iambic(() => this.beginTx(), () => this.endTx()) + this.fortuneBuzzer = new Morse.Buzzer({highFreq: 440}) + this.fortuneIambic = new Morse.Iambic(() => this.fortuneBuzzer.Buzz(true), () => this.fortuneBuzzer.Silence(true)) // Listen for slider values - this.inputInit("#iambic-duration", e => this.iambic.SetIntervalDuration(e.target.value)) - this.inputInit("#rx-delay", e => { this.rxDelay = Number(e.target.value) }) + this.inputInit("#iambic-duration", e => { + this.iambic.SetIntervalDuration(e.target.value) + this.fortuneIambic.SetIntervalDuration(e.target.value) + }) + this.inputInit("#rx-delay", e => { + this.rxDelay = Number(e.target.value) + }) + this.inputInit("#handicap", e => { + this.fortuneIambic.SetPauseMultiplier(e.target.value) + }) // Show what repeater we're on let repeater = (new URL(location)).searchParams.get("repeater") || "General Chaos" @@ -309,6 +321,8 @@ class Vail { this.straightKey(begin) } else if ((event.target.id == "ck") && begin) { this.Test() + } else if ((event.target.id == "fortune") && begin) { + this.PlayFortune() } } @@ -373,6 +387,19 @@ class Vail { this.socket.send(JSON.stringify(msg)) } + /** + * Play a randomly-chosen fortune + && begin */ + PlayFortune() { + if (this.fortuneIambic.Busy()) { + toast("I am already telling your fortune!") + } else { + let fortune = getFortune() + this.fortuneIambic.EnqueueAsciiString(`${fortune}\x04`) + } + } + + maximize(e) { let element = e.target while (!element.classList.contains("mdl-card")) {