From 2f93b6ee0b6d73f5f427f5776cf3ad98818805cf Mon Sep 17 00:00:00 2001 From: Anthony Mann Date: Sun, 2 Sep 2018 20:20:27 +0100 Subject: [PATCH 01/26] Initial Aerospace badge initial commit! --- home_aerospace/aerospace-logo.png | Bin 0 -> 14482 bytes home_aerospace/main.py | 126 ++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 home_aerospace/aerospace-logo.png create mode 100644 home_aerospace/main.py diff --git a/home_aerospace/aerospace-logo.png b/home_aerospace/aerospace-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f5374669184cf6d7cd630926d792435647c8f464 GIT binary patch literal 14482 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 -intro_width: + # intro_position_left -= 1 + # intro_object.x( + # intro_position_left + # ) + # else: + # intro_object.x(0) + # intro_position_left = 0 + + ledChange() + + sleep_or_exit(0.05) From 0bbf655cc2477d775498c176933a7c95d55a4194 Mon Sep 17 00:00:00 2001 From: Tim Jacobs Date: Sun, 2 Sep 2018 21:28:04 +0100 Subject: [PATCH 02/26] simple bf interpreter --- bf-interpreter/main.py | 208 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 bf-interpreter/main.py diff --git a/bf-interpreter/main.py b/bf-interpreter/main.py new file mode 100644 index 0000000..65cd66a --- /dev/null +++ b/bf-interpreter/main.py @@ -0,0 +1,208 @@ +"""Simple brainfuck interpreter. + +Runs very slowly... prints sierpinski triangle""" + +___name___ = "bf interpreter" +___license___ = "MIT" +___dependencies___ = ["sleep", "app"] +___categories___ = ["Other"] + +import ugfx, os, time, sleep, app +from tilda import Buttons +from time import sleep_ms + +# initialize screen +ugfx.init() +ugfx.clear() + +ugfx.set_default_font(ugfx.FONT_TITLE) + + +Prog=""" + +>-[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>++[-]->>>>+>>>+>>>+>>>+>>>+> + >>+>>>+>>>+>>>++[-<+]-<<<<+<<++++[->++++++++<]<++[------>+<]>++<<+[--->++<]>++ +<<-[--->+<]>------<+[-<+]-<[>>+[->+]-<[-]<<[-]+++[>[-]++++++++++.[-]+++[>+[>>+<< +-]>>[<<++[-<+]->++[->+]->-]<<+[-<+]->-[-[-[-[-[-[-[-[->>>]>>>]>>>]>>>]>>>]>>>]>> +>]>>>]>>>>>>>>>>>>>>>>>>>>> > > > > > > > > > > > > >>>>>>>>>>[+[-<+]-<<<<<<.>>> +>>>>]>[+[-<+]-<<<< <<<.>>>>>>>>]>[+[- +<+]-<<<<<<<<.>>> tic tac toe >>>>>>]+[-<+]-<< +<<<.>>>-]<-]+++ to play: type a number (1 to 9) to +++++++.[-]<<<< +<<[<<<<<<<<<<<+ place an X at that grid location [--->++<]>+++.[ +->+++++++<]>.++ ++++.-[---->+<] +>+++.---[->+++<] [ http://mitxela.com/ ] >.+++[->++++<]>+ +.+++++.-[->+++++<] >.[--->+<]>-.+[-<+ +]-<[-]>>>>]<[<<<<<<<++++[++++>---<]>+.[++++>---<]>-.+++[->+++<]>++.+[--->+<]>+.+ +[---->+<]>+++.[--->+<]>-.[-]+[-<+]-<[-]>>>>]<[<<<<<<<<<<+[--->++<]>+++.[->++++++ ++<]>.++++++.-[---->+<]>+++.++++++[->++<]>.+[--->+<]>.++++.++++[->+++<]>.--[--->+ +<]>.[--->+<]>-.+[-<+]-<[-]>>>>]<+[-<+]-<[>>->>>>>>+[-<<<<[-]<<[-]>>>>-[>>[-]+<<+ +<[-]<[-]<[-]<[-]-[----->+<]>---<,>[-<->]<[>>+>+<<<-]>>[<<+>>-]+++++++++[->-[<<]> +]>>-]<<<<[-]>>>>[-]+<<<<<<[>>+>+<<<-]>>[<<+>>-]>>]>>-<<<[-]<<[<->-]<-[-[-[-[-[-[ +-[-[->>>]>>>]>>>]>>>]>>>]>>>]>>>]>>>]]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +>[->++[-<+]->>>>>[>>>[>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>>>>[> +>>[>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>>>>>>>>>>>>>[>>>[>>>[+[- +<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<[-] +++[->+]->]]]+[-<+]->>>>>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+ +[-<+]->>>>>>>>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>> +>[>>>>>>>>>>>>[>>>>>>>>>>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>[>> +>>>>[>>>>>>[+[-<+]-<<<<<<<<<[-]++[->+]->]]]+[-<+]-<<<<<<<<<-[++[->+]-<<<<<<<<<<[ +-]++[->+]->>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->]+[-<+]->>>>>>>[+[-<+]-<<<<<<<<<<[-]+ +[->+]->]+[-<+]->>>>>>>>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->]+[-<+]->>>>>>>>>>>>>[+[-< ++]-<<<<<<<<<<[-]+[->+]->]+[-<+]->>>>>>>>>>>>>>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->]+[ +-<+]->>>>>>>>>>>>>>>>>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->]+[-<+]->>>>>>>>>>>>>>>>>>> +>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->]+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>>[+[-<+]-<<<<<<< +<<<[-]+[->+]->]+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>>>>>[+[-<+]-<<<<<<<<<<[-]+[->+]->] ++[-<+]-<<[-]>[-]+>>>>>>[>>>[>>[+[-<+]-<[-]<[-]++++[->+]->]]]>+[-<+]->>>>>[>>[>>> +>[+[-<+]-<[-]<[-]+++[->+]->]]]>+[-<+]->>>>[>>>>[>>>[+[-<+]-<[-]<[-]++[->+]->]]]> ++[-<+]->>>>>>>>>>>>>>[>>>[>>[+[-<+]-<[-]<[-]+++++++[->+]->]]]>+[-<+]->>>>>>>>>>> +>>>[>>[>>>>[+[-<+]-<[-]<[-]++++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>[>>>>[>>>[+[-<+] +-<[-]<[-]+++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>>[>>>[>>[+[-<+]-<[-]<[-]++ +++++++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>>[>>[>>>>[+[-<+]-<[-]<[-]+++++++ +++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>[>>>>[>>>[+[-<+]-<[-]<[-]++++++++[->+] +->]]]>+[-<+]->>>>>[>>>>>>>>>[>>>>>>>>[+[-<+]-<[-]<[-]++++++++[->+]->]]]>+[-<+]-> +>>>>[>>>>>>>>[>>>>>>>>>>[+[-<+]-<[-]<[-]+++++[->+]->]]]>+[-<+]->>>>[>>>>>>>>>>[> +>>>>>>>>[+[-<+]-<[-]<[-]++[->+]->]]]>+[-<+]->>>>>>>>[>>>>>>>>>[>>>>>>>>[+[-<+]-< +[-]<[-]+++++++++[->+]->]]]>+[-<+]->>>>>>>>[>>>>>>>>[>>>>>>>>>>[+[-<+]-<[-]<[-]++ +++++[->+]->]]]>+[-<+]->>>>>>>[>>>>>>>>>>[>>>>>>>>>[+[-<+]-<[-]<[-]+++[->+]->]]]> ++[-<+]->>>>>>>>>>>[>>>>>>>>>[>>>>>>>>[+[-<+]-<[-]<[-]++++++++++[->+]->]]]>+[-<+] +->>>>>>>>>>>[>>>>>>>>[>>>>>>>>>>[+[-<+]-<[-]<[-]+++++++[->+]->]]]>+[-<+]->>>>>>> +>>>[>>>>>>>>>>[>>>>>>>>>[+[-<+]-<[-]<[-]++++[->+]->]]]>+[-<+]->>>>>[>>>>>>>>>>>> +[>>>>>>>>>>>[+[-<+]-<[-]<[-]++++++++++[->+]->]]]>+[-<+]->>>>[>>>>>>>>>>>>>[>>>>> +>>>>>>>[+[-<+]-<[-]<[-]++[->+]->]]]>+[-<+]->>>>>>>>>>>[>>>>>>[>>>>>[+[-<+]-<[-]< +[-]++++++++[->+]->]]]>+[-<+]->>>>>>>>>>[>>>>>>>[>>>>>>[+[-<+]-<[-]<[-]++++[->+]- +>]]]>+[-<+]->>>>>>[>>>[>[+[-<+]-<[-]<[-]++++[->+]->]]]>+[-<+]->>>>>>[>[>>>>>[+[- +<+]-<[-]<[-]+++[->+]->]]]>+[-<+]->>>>[>>>>>[>>>[+[-<+]-<[-]<[-]++[->+]->]]]>+[-< ++]->>>>>>>>>>>>>>>[>>>[>[+[-<+]-<[-]<[-]+++++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>> +[>[>>>>>[+[-<+]-<[-]<[-]++++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>[>>>>>[>>>[+[-<+]-< +[-]<[-]+++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>[>>>[>[+[-<+]-<[-]<[-]++++ +++++++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>[>[>>>>>[+[-<+]-<[-]<[-]++++++++ ++[->+]->]]]>+[-<+]->>>>>>>>>>>>>>>>>>>>>>[>>>>>[>>>[+[-<+]-<[-]<[-]++++++++[->+] +->]]]>+[-<+]->>>>>>[>>>>>>>>>[>>>>>>>[+[-<+]-<[-]<[-]++++++++[->+]->]]]>+[-<+]-> +>>>>>[>>>>>>>[>>>>>>>>>>>[+[-<+]-<[-]<[-]+++++[->+]->]]]>+[-<+]->>>>[>>>>>>>>>>> +[>>>>>>>>>[+[-<+]-<[-]<[-]++[->+]->]]]>+[-<+]->>>>>>>>>[>>>>>>>>>[>>>>>>>[+[-<+] +-<[-]<[-]+++++++++[->+]->]]]>+[-<+]->>>>>>>>>[>>>>>>>[>>>>>>>>>>>[+[-<+]-<[-]<[- +]++++++[->+]->]]]>+[-<+]->>>>>>>[>>>>>>>>>>>[>>>>>>>>>[+[-<+]-<[-]<[-]+++[->+]-> +]]]>+[-<+]->>>>>>>>>>>>[>>>>>>>>>[>>>>>>>[+[-<+]-<[-]<[-]++++++++++[->+]->]]]>+[ +-<+]->>>>>>>>>>>>[>>>>>>>[>>>>>>>>>>>[+[-<+]-<[-]<[-]+++++++[->+]->]]]>+[-<+]->> +>>>>>>>>[>>>>>>>>>>>[>>>>>>>>>[+[-<+]-<[-]<[-]++++[->+]->]]]>+[-<+]->>>>>>[>>>>> +>>>>>>>[>>>>>>>>>>[+[-<+]-<[-]<[-]++++++++++[->+]->]]]>+[-<+]->>>>[>>>>>>>>>>>>> +>[>>>>>>>>>>>>[+[-<+]-<[-]<[-]++[->+]->]]]>+[-<+]->>>>>>>>>>>>[>>>>>>[>>>>[+[-<+ +]-<[-]<[-]++++++++[->+]->]]]>+[-<+]->>>>>>>>>>[>>>>>>>>[>>>>>>[+[-<+]-<[-]<[-]++ +++[->+]->]]]>+[-<+]-<[>>+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>>>>>[+[-<+]-<[-]<[-]+++++ ++++++[->+]->]+[-<+]->>>>>>>>>>>>>>>>>>>>>>[+[-<+]-<[-]<[-]++++++++[->+]->]+[-<+] +->>>>>>>>>>[+[-<+]-<[-]<[-]++++[->+]->]+[-<+]->>>>[+[-<+]-<[-]<[-]++[->+]->]+[-< ++]->>>>>>>>>>>>>>>>>>>>>>>>>[+[-<+]-<[-]<[-]+++++++++[->+]->]+[-<+]->>>>>>>>>>>> +>>>>>>>[+[-<+]-<[-]<[-]+++++++[->+]->]+[-<+]->>>>>>>>>>>>>[+[-<+]-<[-]<[-]+++++[ +->+]->]+[-<+]->>>>>>>[+[-<+]-<[-]<[-]+++[->+]->]+[-<+]->>>>>>>>>>>>>>>>[+[-<+]-< +[-]<[-]++++++[->+]->]+[-<+]->]>>+[-<+]-<<<<[+[->+]->>>>>>>>>>>>>>>>>[+[-<+]-<[-] +<[-]++[->+]->]+[-<+]->]>>>>+[-<+]-<<[>>>+[-<+]-<[-]<[+[-<+]->++[->+]-<<-]+[-<+]- +>-[-[-[-[-[-[-[-[->>>]>>>]>>>]>>>]>>>]>>>]>>>]>>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +>>>>>>>>>>>>>->>++[-<+]->]>>>>+[-<+]-<<[-]>>>+[-<+]-<<<<[-]>>>>>+[-<+]->>>>>>[>> +>[>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>>>>>[>>>[>>>[+[-<+]-<<< +<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>>>>>>>>>>>>>>[>>>[>>>[+[-<+]-<<<<<<<<<< +<[-]++[->+]->]]]+[-<+]->>>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]-> +]]]+[-<+]->>>>>>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]->]]]+[-<+]- +>>>>>>>>>>>>[>>>>>>>>>[>>>>>>>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>[ +>>>>>>>>>>>>[>>>>>>>>>>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]->]]]+[-<+]->>>>>>>>>>>>[> + >>>>>[>>>>>>[+[-<+]-<<<<<<<<<<<[-]++[->+]->]]]+[-<+]-<[-]]++[->+]->]+[-<+]-<+[ + -<+]-<]>>+[->+]->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+[-[-]<+]-<+[-[-]<+]-<+>] +""" + + + +# Hello World +#Prog="++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++." + +# Sierpinski +Prog=""" +++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[ + -<<<[ + ->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<< + ]>.>+[>>]>+ +]""" + + + + +buf="" +def output(t): + global buf + buf+=t + buf=buf[-(16*80):] + ugfx.clear() + lines=buf.split("\n") + lines=lines[-16:] + for i,v in enumerate(lines): + ugfx.text(5,i*20+5, v+" ", ugfx.BLACK) + +lastpushed=0 +def pushed(n): + global Tape, TP, waiting + if (waiting): + output(n+" \n") + Tape[TP]=ord(n) + waiting=False + + + +Buttons.enable_interrupt(Buttons.BTN_1, lambda button_id:pushed("1"), on_press=True, on_release=False) +Buttons.enable_interrupt(Buttons.BTN_2, lambda button_id:pushed("2"), on_press=True, on_release=False) +Buttons.enable_interrupt(Buttons.BTN_3, lambda button_id:pushed("3"), on_press=True, on_release=False) +Buttons.enable_interrupt(Buttons.BTN_4, lambda button_id:pushed("4"), on_press=True, on_release=False) +Buttons.enable_interrupt(Buttons.BTN_5, lambda button_id:pushed("5"), on_press=True, on_release=False) +Buttons.enable_interrupt(Buttons.BTN_6, lambda button_id:pushed("6"), on_press=True, on_release=False) +Buttons.enable_interrupt(Buttons.BTN_7, lambda button_id:pushed("7"), on_press=True, on_release=False) +Buttons.enable_interrupt(Buttons.BTN_8, lambda button_id:pushed("8"), on_press=True, on_release=False) +Buttons.enable_interrupt(Buttons.BTN_9, lambda button_id:pushed("9"), on_press=True, on_release=False) +Buttons.enable_interrupt(Buttons.BTN_0, lambda button_id:pushed("0"), on_press=True, on_release=False) + + + +output("Loading...") + + + + +waiting=False +Prog+='\0' +Tape=[0]*256 +PP=-1 +TP=0 +while True: + if (waiting): + sleep_ms(200) + else: + PP=PP+1 + if (PP>=len(Prog)): + waiting=True + output("END!") + elif (Prog[PP]=="+"): + Tape[TP]=Tape[TP]+1 + elif (Prog[PP] =="-"): + Tape[TP]=Tape[TP]-1 + elif (Prog[PP] ==">"): + TP=TP+1 + elif (Prog[PP] =="<"): + TP=TP-1 + elif (Prog[PP] =="."): + output(chr(Tape[TP])) + elif (Prog[PP] ==","): + waiting=True + elif (Prog[PP] =="["): + if (Tape[TP]==0): + depth=1 + while (depth>0): + PP=PP+1 + if (Prog[PP]=="]"): + depth = depth - 1 + if (Prog[PP]=="["): + depth = depth + 1 + elif (Prog[PP] =="]"): + if (Tape[TP]!=0): + depth=1 + while (depth>0): + PP=PP-1 + if (Prog[PP]=="]"): + depth = depth + 1 + if (Prog[PP]=="["): + depth = depth - 1 + From 4d046a9c6c10d7fd7b244f7ef49fd7722a4f937a Mon Sep 17 00:00:00 2001 From: Calantha Date: Sun, 2 Sep 2018 22:13:41 +0100 Subject: [PATCH 03/26] First Commit --- cards_against_emf/cards.json | 4272 ++++++++++++++++++++++++++++++++++ cards_against_emf/main.py | 58 + 2 files changed, 4330 insertions(+) create mode 100644 cards_against_emf/cards.json create mode 100644 cards_against_emf/main.py diff --git a/cards_against_emf/cards.json b/cards_against_emf/cards.json new file mode 100644 index 0000000..2711b2a --- /dev/null +++ b/cards_against_emf/cards.json @@ -0,0 +1,4272 @@ +{ + "blackCards": [ + { + "text": "Why can't I sleep at night?", + "pick": 1 + }, + { + "text": "I got 99 problems but _ ain't one.", + "pick": 1 + }, + { + "text": "What's a girl's best friend?", + "pick": 1 + }, + { + "text": "What's that smell?", + "pick": 1 + }, + { + "text": "This is the way the world ends / This is the way the world ends / Not with a bang but with _.", + "pick": 1 + }, + { + "text": "What is Batman's guilty pleasure?", + "pick": 1 + }, + { + "text": "TSA guidelines now prohibit _ on airplanes.", + "pick": 1 + }, + { + "text": "What ended my last relationship?", + "pick": 1 + }, + { + "text": "MTV's new reality show features eight washed-up celebrities living with _.", + "pick": 1 + }, + { + "text": "I drink to forget _.", + "pick": 1 + }, + { + "text": "I'm sorry, Professor, but I couldn't complete my homework because of _.", + "pick": 1 + }, + { + "text": "Alternative medicine is now embracing the curative powers of _.", + "pick": 1 + }, + { + "text": "What's that sound?", + "pick": 1 + }, + { + "text": "What's the next Happy Meal® toy?", + "pick": 1 + }, + { + "text": "It's a pity that kids these days are all getting involved with _.", + "pick": 1 + }, + { + "text": "In the new Disney Channel Original Movie, Hannah Montana struggles with _ for the first time.", + "pick": 1 + }, + { + "text": "_. That's how I want to die.", + "pick": 1 + }, + { + "text": "What does Dick Cheney prefer?", + "pick": 1 + }, + { + "text": "What's the most emo?", + "pick": 1 + }, + { + "text": "Instead of coal, Santa now gives the bad children _.", + "pick": 1 + }, + { + "text": "Next from J.K. Rowling: Harry Potter and the Chamber of _.", + "pick": 1 + }, + { + "text": "A romantic, candlelit dinner would be incomplete without _.", + "pick": 1 + }, + { + "text": "White people like _.", + "pick": 1 + }, + { + "text": "_. Betcha can't have just one!", + "pick": 1 + }, + { + "text": "War!

What is it good for?", + "pick": 1 + }, + { + "text": "BILLY MAYS HERE FOR _.", + "pick": 1 + }, + { + "text": "_. High five, bro.", + "pick": 1 + }, + { + "text": "During sex, I like to think about _.", + "pick": 1 + }, + { + "text": "What did I bring back from Mexico?", + "pick": 1 + }, + { + "text": "What are my parents hiding from me?", + "pick": 1 + }, + { + "text": "What will always get you laid?", + "pick": 1 + }, + { + "text": "What would grandma find disturbing, yet oddly charming?", + "pick": 1 + }, + { + "text": "What did the U.S. airdrop to the children of Afghanistan?", + "pick": 1 + }, + { + "text": "What helps Obama unwind?", + "pick": 1 + }, + { + "text": "What's there a ton of in heaven?", + "pick": 1 + }, + { + "text": "Major League Baseball has banned _ for giving players an unfair advantage.", + "pick": 1 + }, + { + "text": "When I am a billionaire, I shall erect a 50-foot statue to commemorate _.", + "pick": 1 + }, + { + "text": "What's the new fad diet?", + "pick": 1 + }, + { + "text": "When I am the President of the United States, I will create the Department of _.", + "pick": 1 + }, + { + "text": "_. It's a trap!", + "pick": 1 + }, + { + "text": "How am I maintaining my relationship status?", + "pick": 1 + }, + { + "text": "What will I bring back in time to convince people that I am a powerful wizard?", + "pick": 1 + }, + { + "text": "While the United States raced the Soviet Union to the moon, the Mexican government funneled millions of pesos into research on _.", + "pick": 1 + }, + { + "text": "Coming to Broadway this season, _: The Musical.", + "pick": 1 + }, + { + "text": "What's my secret power?", + "pick": 1 + }, + { + "text": "What gives me uncontrollable gas?", + "pick": 1 + }, + { + "text": "But before I kill you, Mr. Bond, I must show you _.", + "pick": 1 + }, + { + "text": "What never fails to liven up the party?", + "pick": 1 + }, + { + "text": "What am I giving up for Lent?", + "pick": 1 + }, + { + "text": "What do old people smell like? ", + "pick": 1 + }, + { + "text": "The class field trip was completely ruined by _.", + "pick": 1 + }, + { + "text": "When Pharaoh remained unmoved, Moses called down a plague of _.", + "pick": 1 + }, + { + "text": "I do not know with which weapons World War III will be fought, but World War IV will be fought with _.", + "pick": 1 + }, + { + "text": "What's Teach for America using to inspire inner city students to succeed?", + "pick": 1 + }, + { + "text": "In Michael Jackson's final moments, he thought about _.", + "pick": 1 + }, + { + "text": "Why do I hurt all over?", + "pick": 1 + }, + { + "text": "Studies show that lab rats navigate mazes 50% faster after being exposed to _.", + "pick": 1 + }, + { + "text": "Why am I sticky?", + "pick": 1 + }, + { + "text": "What's my anti-drug?", + "pick": 1 + }, + { + "text": "And the Academy Award for _ goes to _.", + "pick": 2 + }, + { + "text": "For my next trick, I will pull _ out of _.", + "pick": 2 + }, + { + "text": "_: Good to the last drop.", + "pick": 1 + }, + { + "text": "What did Vin Diesel eat for dinner?", + "pick": 1 + }, + { + "text": "_: kid-tested, mother-approved.", + "pick": 1 + }, + { + "text": "What gets better with age?", + "pick": 1 + }, + { + "text": "I never truly understood _ until I encountered _.", + "pick": 2 + }, + { + "text": "Rumor has it that Vladimir Putin's favorite delicacy is _ stuffed with _.", + "pick": 2 + }, + { + "text": "Lifetime® presents _, the story of _.", + "pick": 2 + }, + { + "text": "Make a haiku.", + "pick": 3 + }, + { + "text": "In M. Night Shyamalan's new movie, Bruce Willis discovers that _ had really been _ all along.", + "pick": 2 + }, + { + "text": "_ is a slippery slope that leads to _.", + "pick": 2 + }, + { + "text": "In a world ravaged by _, our only solace is _.", + "pick": 2 + }, + { + "text": "That's right, I killed _. How, you ask? _.", + "pick": 2 + }, + { + "text": "When I was tripping on acid, _ turned into _.", + "pick": 2 + }, + { + "text": "_ + _ = _.", + "pick": 3 + }, + { + "text": "What's the next superhero/sidekick duo?", + "pick": 2 + }, + { + "text": "Dear Abby,

I'm having some trouble with _ and would like your advice.", + "pick": 1 + }, + { + "text": "After the earthquake, Sean Penn brought _ to the people of Haiti.", + "pick": 1 + }, + { + "text": "In L.A. County Jail, word is you can trade 200 cigarettes for _.", + "pick": 1 + }, + { + "text": "Maybe she's born with it. Maybe it's _.", + "pick": 1 + }, + { + "text": "Life for American Indians was forever changed when the White Man introduced them to _.", + "pick": 1 + }, + { + "text": "Next on ESPN2, the World Series of _.", + "pick": 1 + }, + { + "text": "Step 1: _. Step 2: _. Step 3: Profit.", + "pick": 2 + }, + { + "text": "Here is the church
Here is the steeple
Open the doors
And there is _.", + "pick": 1 + }, + { + "text": "How did I lose my virginity?", + "pick": 1 + }, + { + "text": "During his childhood, Salvador Dalí produced hundreds of paintings of _.", + "pick": 1 + }, + { + "text": "In 1,000 years, when paper money is a distant memory, how will we pay for goods and services?", + "pick": 1 + }, + { + "text": "What don't you want to find in your Kung Pao chicken?", + "pick": 1 + }, + { + "text": "The Smithsonian Museum of Natural History has just opened an exhibit on _.", + "pick": 1 + }, + { + "text": "Daddy, why is Mommy crying?", + "pick": 1 + }, + { + "text": "What brought the orgy to a grinding halt?", + "pick": 1 + }, + { + "text": "When I pooped, what came out of my butt?", + "pick": 1 + }, + { + "text": "In the distant future, historians will agree that _ marked the beginning of America's decline.", + "pick": 1 + }, + { + "text": "What's the gift that keeps on giving?", + "pick": 1 + }, + { + "text": "This season on Man vs. Wild, Bear Grylls must survive in the depths of the Amazon with only _ and his wits.", + "pick": 1 + }, + { + "text": "Michael Bay's new three-hour action epic pits _ against _.", + "pick": 2 + }, + { + "text": "And I would have gotten away with it, too, if it hadn't been for _!", + "pick": 1 + }, + { + "text": "In a pinch, _ can be a suitable substitute for _.", + "pick": 2 + }, + { + "text": "What has been making life difficult at the nudist colony?", + "pick": 1 + }, + { + "text": "Science will never explain the origin of _.", + "pick": 1 + }, + { + "text": "In Rome, there are whisperings that the Vatican has a secret room devoted to _.", + "pick": 1 + }, + { + "text": "I learned the hard way that you can't cheer up a grieving friend with _.", + "pick": 1 + }, + { + "text": "When all else fails, I can always masturbate to _.", + "pick": 1 + }, + { + "text": "An international tribunal has found _ guilty of _.", + "pick": 2 + }, + { + "text": "In its new tourism campaign, Detroit proudly proclaims that it has finally eliminated _.", + "pick": 1 + }, + { + "text": "In his new self-produced album, Kanye West raps over the sounds of _.", + "pick": 1 + }, + { + "text": "The socialist governments of Scandinavia have declared that access to _ is a basic human right.", + "pick": 1 + }, + { + "text": "He who controls _ controls the world.", + "pick": 1 + }, + { + "text": "Dear Sir or Madam, We regret to inform you that the Office of _ has denied your request for _.", + "pick": 2 + }, + { + "text": "The CIA now interrogates enemy agents by repeatedly subjecting them to _.", + "pick": 1 + }, + { + "text": "_ would be woefully incomplete without _.", + "pick": 2 + }, + { + "text": "During his midlife crisis, my dad got really into _.", + "pick": 1 + }, + { + "text": "Before I run for president, I must destroy all evidence of my involvement with _.", + "pick": 1 + }, + { + "text": "My new favorite porn star is Joey \"_\" McGee.", + "pick": 1 + }, + { + "text": "In his newest and most difficult stunt, David Blaine must escape from _.", + "pick": 1 + }, + { + "text": "This is your captain speaking. Fasten your seatbelts and prepare for _.", + "pick": 1 + }, + { + "text": "My mom freaked out when she looked at my browser history and found _.com/_.", + "pick": 2 + }, + { + "text": "The Five Stages of Grief: denial, anger, bargaining, _, acceptance.", + "pick": 1 + }, + { + "text": "Members of New York's social elite are paying thousands of dollars just to experience _.", + "pick": 1 + }, + { + "text": "I went from _ to _, all thanks to _.", + "pick": 3 + }, + { + "text": "Little Miss Muffet Sat on a tuffet, Eating her curds and _.", + "pick": 1 + }, + { + "text": "This month's Cosmo: \"Spice up your sex life by bringing _ into the bedroom.\"", + "pick": 1 + }, + { + "text": "If God didn't want us to enjoy _, he wouldn't have given us _.", + "pick": 2 + }, + { + "text": "My country, 'tis of thee, sweet land of _.", + "pick": 1 + }, + { + "text": "After months of debate, the Occupy Wall Street General Assembly could only agree on \"More _!\"", + "pick": 1 + }, + { + "text": "I spent my whole life working toward _, only to have it ruined by _.", + "pick": 2 + }, + { + "text": "Next time on Dr. Phil: How to talk to your child about _.", + "pick": 1 + }, + { + "text": "Only two things in life are certain: death and _.", + "pick": 1 + }, + { + "text": "Everyone down on the ground! We don't want to hurt anyone. We're just here for _.", + "pick": 1 + }, + { + "text": "The healing process began when I joined a support group for victims of _.", + "pick": 1 + }, + { + "text": "The votes are in, and the new high school mascot is _.", + "pick": 1 + }, + { + "text": "Charades was ruined for me forever when my mom had to act out _.", + "pick": 1 + }, + { + "text": "Before _, all we had was _.", + "pick": 2 + }, + { + "text": "Tonight on 20/20: What you don't know about _ could kill you.", + "pick": 1 + }, + { + "text": "You haven't truly lived until you've experienced _ and _ at the same time.", + "pick": 2 + }, + { + "text": "Hey baby, come back to my place and I'll show you _.", + "pick": 1 + }, + { + "text": "My gym teacher got fired for adding _ to the obstacle course.", + "pick": 1 + }, + { + "text": "Finally! A service that delivers _ right to your door.", + "pick": 1 + }, + { + "text": "To prepare for his upcoming role, Daniel Day-Lewis immersed himself in the world of _.", + "pick": 1 + }, + { + "text": "My life is ruled by a vicious cycle of _ and _.", + "pick": 2 + }, + { + "text": "During high school, I never really fit in until I found _ club.", + "pick": 1 + }, + { + "text": "Money can't buy me love, but it can buy me _.", + "pick": 1 + }, + { + "text": "Listen, son. If you want to get involved with _, I won't stop you. Just steer clear of _.", + "pick": 2 + }, + { + "text": "A successful job interview begins with a firm handshake and ends with _.", + "pick": 1 + }, + { + "text": "Call the law offices of Goldstein & Goldstein, because no one should have to tolerate _ in the workplace.", + "pick": 1 + }, + { + "text": "Lovin' you is easy 'cause you're _.", + "pick": 1 + }, + { + "text": "The blind date was going horribly until we discovered our shared interest in _.", + "pick": 1 + }, + { + "text": "What left this stain on my couch?", + "pick": 1 + }, + { + "text": "Turns out that _-Man was neither the hero we needed nor wanted.", + "pick": 1 + }, + { + "text": "After months of practice with _, I think I'm finally ready for _.", + "pick": 2 + }, + { + "text": "In the seventh circle of Hell, sinners must endure _ for all eternity.", + "pick": 1 + }, + { + "text": "As part of his daily regimen, Anderson Cooper sets aside 15 minutes for _.", + "pick": 1 + }, + { + "text": "When you get right down to it, _ is just _.", + "pick": 2 + }, + { + "text": "Having problems with _? Try _!", + "pick": 2 + }, + { + "text": "And what did you bring for show and tell?", + "pick": 1 + }, + { + "text": "I'm not like the rest of you. I'm too rich and busy for _.", + "pick": 1 + }, + { + "text": "With enough time and pressure, _ will turn into _.", + "pick": 2 + }, + { + "text": "_: Hours of fun. Easy to use. Perfect for _!", + "pick": 2 + }, + { + "text": "_. Awesome in theory, kind of a mess in practice.", + "pick": 1 + }, + { + "text": "As part of his contract, Prince won't perform without _ in his dressing room.", + "pick": 1 + }, + { + "text": "Man, this is bullshit. Fuck _.", + "pick": 1 + }, + { + "text": "Dear Leader Kim Jong-un,
our village praises your infinite wisdom with a humble offering of _.", + "pick": 1 + }, + { + "text": "_ may pass, but _ will last forever.", + "pick": 2 + }, + { + "text": "She's up all night for good fun.
I'm up all night for _.", + "pick": 1 + }, + { + "text": "Alright, bros. Our frat house is condemned, and all the hot slampieces are over at Gamma Phi. The time has come to commence Operation _.", + "pick": 1 + }, + { + "text": "The Japanese have developed a smaller, more efficient version of _.", + "pick": 1 + }, + { + "text": "In return for my soul, the Devil promised me _, but all I got was _.", + "pick": 2 + }, + { + "text": "You guys, I saw this crazy movie last night. It opens on _, and then there's some stuff about _, and then it ends with _.", + "pick": 3 + }, + { + "text": "_ will never be the same after _.", + "pick": 2 + }, + { + "text": "Wes Anderson's new film tells the story of a precocious child coming to terms with _.", + "pick": 1 + }, + { + "text": "In the beginning, there was _.
And the Lord said, \"Let there be _.\"", + "pick": 2 + }, + { + "text": "What's fun until it gets weird?", + "pick": 1 + }, + { + "text": "We never did find _, but along the way we sure learned a lot about _.", + "pick": 2 + }, + { + "text": "You've seen the bearded lady!
You've seen the ring of fire!
Now, ladies and gentlemen, feast your eyes upon _!", + "pick": 1 + }, + { + "text": "How am I compensating for my tiny penis?", + "pick": 1 + }, + { + "text": "I'm sorry, sir, but we don't allow _ at the country club.", + "pick": 1 + }, + { + "text": "2 AM in the city that never sleeps. The door swings open and she walks in, legs up to here. Something in her eyes tells me she's looking for _.", + "pick": 1 + }, + { + "text": "As king, how will I keep the peasants in line?", + "pick": 1 + }, + { + "text": "Oprah's book of the month is \"_ For _: A Story of Hope.\"", + "pick": 2 + }, + { + "text": "Do not fuck with me! I am literally _ right now.", + "pick": 1 + }, + { + "text": "Adventure.
Romance.
_.

From Paramount Pictures, \"_.\"", + "pick": 2 + }, + { + "text": "I am become _, destroyer of _!", + "pick": 2 + }, + { + "text": "It lurks in the night. It hungers for flesh. This summer, no one is safe from _.", + "pick": 1 + }, + { + "text": "If you can't handle _, you'd better stay away from _.", + "pick": 2 + }, + { + "text": "This is the prime of my life. I'm young, hot, and full of _.", + "pick": 1 + }, + { + "text": "I'm pretty sure I'm high right now, because I'm absolutely mesmerized by _.", + "pick": 1 + }, + { + "text": "This year's hottest album is \"_\" by _.", + "pick": 2 + }, + { + "text": "Every step towards _ gets me a little closer to _.", + "pick": 2 + }, + { + "text": "Forget everything you know about _, because now we've supercharged it with _!", + "pick": 2 + }, + { + "text": "Honey, I have a new role-play I want to try tonight! You can be _, and I'll be _.", + "pick": 2 + }, + { + "text": "Do the Dew ® with our most extreme flavor yet! Get ready for Mountain Dew _!", + "pick": 1 + }, + { + "text": "Armani suit: $1,000. Dinner for two at that swanky restaurant: $300. The look on her face when you surprise her with _: priceless.", + "pick": 1 + }, + { + "text": "In his new action comedy, Jackie Chan must fend off ninjas while also dealing with _.", + "pick": 1 + }, + { + "text": "Well what do you have to say for yourself, Casey? This is the third time you've been sent to the principal's office for _.", + "pick": 1 + }, + { + "text": "Here at the Academy for Gifted Children, we allow students to explore _ at their own pace.", + "pick": 1 + }, + { + "text": "Heed my voice, mortals! I am the god of _, and I will not tolerate _!", + "pick": 2 + }, + { + "text": "I don't mean to brag, but they call me the Michael Jordan of _.", + "pick": 1 + }, + { + "text": "Why am I broke?", + "pick": 1 + }, + { + "text": "Help me doctor, I've got _ in my butt!", + "pick": 1 + }, + { + "text": "Hi MTV! My name is Kendra, I live in Malibu, I'm into _, and I love to have a good time.", + "pick": 1 + }, + { + "text": "Patient presents with _. Likely a result of _.", + "pick": 2 + }, + { + "text": "Life's pretty tough in the fast lane. That's why I never leave the house without _.", + "pick": 1 + }, + { + "text": "What's making things awkward in the sauna?", + "pick": 1 + }, + { + "text": "Get ready for the movie of the summer! One cop plays by the book. The other's only interested in one thing: _.", + "pick": 1 + }, + { + "text": "Having the worst day EVER. #_", + "pick": 1 + }, + { + "text": "In his farewell address, George Washington famously warned Americans about the dangers of _.", + "pick": 1 + }, + { + "text": "Don't forget! Beginning this week, Casual Friday will officially become \"_ Friday.\"", + "pick": 1 + }, + { + "text": "What killed my boner?", + "pick": 1 + }, + { + "text": "Yo' mama so fat she _!", + "pick": 1 + }, + { + "text": "Well if _ is good enough for _, it's good enough for me.", + "pick": 2 + }, + { + "text": "Hi, this is Jim from accounting. We noticed a $1,200 charge labeled \"_\". Can you explain?", + "pick": 1 + }, + { + "text": "Do you lack energy? Does it sometimes feel like the whole world is _? Zoloft.®", + "pick": 1 + }, + { + "text": "WHOOO! God damn I love _!", + "pick": 1 + }, + { + "text": "Now in bookstores: \"The Audacity of _\", by Barack Obama.", + "pick": 1 + }, + { + "text": "And today's soup is Cream of _.", + "pick": 1 + }, + { + "pick": 1, + "text": "I work my ass off all day for this family, and this is what I come home to? _!?" + }, + { + "pick": 1, + "text": "I have a strict policy. First date, dinner. Second date, kiss. Third date, _." + }, + { + "pick": 1, + "text": "When I was a kid, we used to play Cowboys and _." + }, + { + "pick": 1, + "text": "This is America. If you don't work hard, you don't succeed. I don't care if you're black, white, purple, or _." + }, + { + "pick": 1, + "text": "You Won't Believe These 15 Hilarious _ Bloopers!" + }, + { + "pick": 1, + "text": "James is a lonely boy. But when he discovers a secret door in his attic, he meets a magical new friend: _." + }, + { + "pick": 1, + "text": "Don't worry kid. It gets better. I've been living with _ for 20 years." + }, + { + "pick": 1, + "text": "My grandfather worked his way up from nothing. When he came to this country, all he had was the shoes on his feet and _." + }, + { + "pick": 1, + "text": "Behind every powerful man is _." + }, + { + "pick": 1, + "text": "You are not alone. Millions of Americans struggle with _ every day." + }, + { + "pick": 1, + "text": "Come to Dubai, where you can relax in our world famous spas, experience the nightlife, or simply enjoy _ by the poolside." + }, + { + "pick": 1, + "text": "\"This is madness.\" \"No, THIS IS _!\"" + }, + { + "pick": 1, + "text": "Listen Gary, I like you. But if you want that corner office, you're going to have to show me _." + }, + { + "pick": 1, + "text": "I went to the desert and ate of the peyote cactus. Turns out my spirit animal is _." + }, + { + "pick": 1, + "text": "And would you like those buffalo wings mild, hot, or _?" + }, + { + "pick": 1, + "text": "The six things I could never do without: oxygen, Facebook, chocolate, Netflix, friends, and _ LOL!" + }, + { + "pick": 1, + "text": "Why won't you make love to me anymore? Is it _?" + }, + { + "pick": 1, + "text": "Puberty is a time of change. You might notice hair growing in new places. You might develop an interest in _. This is normal." + }, + { + "pick": 1, + "text": "I'm sorry, Mrs. Chen, but there was nothing we could do. At 4:15 this morning, your son succumbed to _." + }, + { + "pick": 1, + "text": "I'm Miss Tennessee, and if I could make the world better by changing one thing, I would get rid of _." + }, + { + "pick": 1, + "text": "Tonight we will have sex. And afterwards, If you'd like, a little bit of _." + }, + { + "pick": 1, + "text": "Everybody join hands and close your eyes. Do you sense that? That's the presence of _ in this room." + }, + { + "pick": 1, + "text": "To become a true Yanomamo warrior, you must prove that you can withstand _ without crying out." + }, + { + "pick": 1, + "text": "Y'all ready to get this thing started? I'm Nick Cannon, and this is America's Got _." + }, + { + "pick": 1, + "text": "If you had to describe the Card Czar, using only one of the cards in your hand, which one would it be?" + }, + { + "pick": 2, + "text": "_ be all like _." + }, + { + "pick": 1, + "text": "Art isn't just a painting in a stuffy museum. Art is alive. Art is _." + }, + { + "pick": 1, + "text": "As reparations for slavery, all African Americans will receive _." + }, + { + "pick": 1, + "text": "As Teddy Roosevelt said, the four manly virtues are honor, temperance, industry, and _." + }, + { + "pick": 1, + "text": "Best you go back where you came from, now. We don't take too kindly to _ in these parts." + }, + { + "pick": 1, + "text": "CNN breaking news! Scientists discover _." + }, + { + "pick": 1, + "text": "Coming to Red Lobster® this month, _." + }, + { + "pick": 1, + "text": "Congratulations! You have been selected for our summer internship program. While we are unable to offer a salary, we can offer you _." + }, + { + "pick": 1, + "text": "Dance like there's nobody watching, love like you'll never be hurt, and live like you're _." + }, + { + "pick": 1, + "text": "Errbody in the club _." + }, + { + "pick": 1, + "text": "Feeling so grateful! #amazing #mylife #_." + }, + { + "pick": 1, + "text": "Girls just wanna have _." + }, + { + "pick": 1, + "text": "Google Calendar alert: _ in 10 minutes." + }, + { + "pick": 1, + "text": "I don't believe in God. I believe in _." + }, + { + "pick": 1, + "text": "I got rhythm, I've got music, I've got _. Who could ask for anything more?" + }, + { + "pick": 1, + "text": "I may not be much to look at, but I fuck like _." + }, + { + "pick": 1, + "text": "I tell you, it was a non-stop fuckfest. When it was over, my asshole looked like _." + }, + { + "pick": 1, + "text": "I'll take the BBQ bacon burger with friend egg and fuck it how about _." + }, + { + "pick": 1, + "text": "I'm sorry, sir, but your insurance plan doesn't cover injuries caused by _." + }, + { + "pick": 1, + "text": "I've had a horrible vision, father. I saw mountains crumbling, stars falling from the sky. I saw _." + }, + { + "pick": 1, + "text": "If at first you don't succeed, try _." + }, + { + "pick": 1, + "text": "In the 1950s, psychologists prescribed _ as a cure for homosexually." + }, + { + "pick": 1, + "text": "LSD + _ = really bad time." + }, + { + "pick": 1, + "text": "\"Mom's to-do list:
- Buy Groceries.
- Clean up _.
- Soccer Practice.\"" + }, + { + "pick": 1, + "text": "Most Americans would not vote for a candidate who is openly _." + }, + { + "pick": 1, + "text": "No, no, no, no, no, no, NO! I will NOT let _ ruin this wedding." + }, + { + "pick": 1, + "text": "Oh no! Siri, how do I fix _?" + }, + { + "pick": 1, + "text": "One more thing. Watch out for Big Mike. They say he killed a man with _." + }, + { + "pick": 1, + "text": "Ooo, daddy like _." + }, + { + "pick": 1, + "text": "Poor Brandon, still living in his parent's basement. I heard he never got over _." + }, + { + "pick": 1, + "text": "Run, run, as fast as you can! You can't catch me, I'm _!" + }, + { + "pick": 1, + "text": "She's a lady in the streets, _ in the sheets." + }, + { + "pick": 1, + "text": "She's just one of the guys, you know? She likes beer, and football, and _." + }, + { + "pick": 1, + "text": "Son, take it from someone who's been around the block a few times. Nothin' puts her in the mood like _." + }, + { + "pick": 1, + "text": "Summer lovin', had me a blast. _, happened so fast." + }, + { + "pick": 1, + "text": "\"The top Google auto-complete results for \"Barack Obama\":
- Barack Obama Height.
- Barack Obama net worth.
- Barack Obama _.\"" + }, + { + "pick": 1, + "text": "Then the princess kissed the frog, and all of a sudden the frog was _!" + }, + { + "pick": 1, + "text": "There is no God. It's just _ and then you die." + }, + { + "pick": 1, + "text": "This Friday at the Liquid Lunge, it's _ Night! Ladies drink free." + }, + { + "pick": 1, + "text": "We do not shake with our left hands in this country. That is the hand we use for _." + }, + { + "pick": 1, + "text": "Well if _ is a crime, then lock me up!" + }, + { + "pick": 1, + "text": "Well, shit. My eyes ain't so good, but I'll eat my own boot if that ain't _!" + }, + { + "pick": 1, + "text": "What are all those whales singing about?" + }, + { + "pick": 1, + "text": "What sucks balls?" + }, + { + "pick": 1, + "text": "What totally destroyed my asshole?" + }, + { + "pick": 1, + "text": "What turned me into a Republican?" + }, + { + "pick": 1, + "text": "What will end racism once and for all?" + }, + { + "pick": 1, + "text": "What's a total waste of Hillary Clinton's time?" + }, + { + "pick": 1, + "text": "What's about to take dance floor to the next level?" + }, + { + "pick": 1, + "text": "What's the gayest?" + }, + { + "pick": 1, + "text": "What's the most problematic?" + }, + { + "pick": 1, + "text": "Why am I laughing and crying and taking off my clothes?" + }, + { + "pick": 1, + "text": "With a one-time gift of just $10, you can save this child from _." + }, + { + "pick": 1, + "text": "You know who else liked _? Hitler." + }, + { + "pick": 1, + "text": "You won't believe what's in my pussy. It's _." + }, + { + "text": "Siskel and Ebert have panned _ as \"poorly conceived\" and \"sloppily executed.\"", + "pick": 1 + }, + { + "text": "Up next on Nickelodeon: \"Clarissa Explains _.\"", + "pick": 1 + }, + { + "text": "Believe it or not, Jim Carrey can do a dead-on impression of _.", + "pick": 1 + }, + { + "text": "It's Morphin' Time! Mastadon! Pterodactyl! Triceratops! Sabertooth Tiger! _!", + "pick": 1 + }, + { + "text": "I'm a bitch, I'm a lover, I'm a child, I'm _.", + "pick": 1 + }, + { + "text": "How did Stella get her groove back?", + "pick": 1 + }, + { + "text": "Tonight on SNICK: \"Are You Afraid of _?\"", + "pick": 1 + }, + { + "pick": 1, + "text": "And in the end, the dragon was not evil; he just wanted _." + }, + { + "pick": 2, + "text": "Critics are raving about HBO's new Game of Thrones spin-off, \"_ of _.\"" + }, + { + "pick": 1, + "text": "Having tired of poetry and music, the immortal elves now fill their days with _." + }, + { + "pick": 1, + "text": "Legend tells of a princess who has been asleep for a thousand years and can only be awoken by _." + }, + { + "pick": 1, + "text": "Who blasphemes and bubbles at the center of all infinity, whose name no lips dare speak aloud, and who gnaws hungrily in inconceivable, unlighted chambers beyond time?" + }, + { + "pick": 1, + "text": "Your father was a powerful wizard, Harry. Before he died, he left you something very precious: _." + }, + { + "pick": 1, + "text": "I'm Bobby Flay, and if you can't stand _, get out of the kitchen!" + }, + { + "pick": 1, + "text": "It's not delivery. It's _." + }, + { + "pick": 1, + "text": "Aw babe, your burps smell like _!" + }, + { + "pick": 1, + "text": "Don't miss Rachel Ray's hit new show, Cooking with _." + }, + { + "pick": 1, + "text": "Excuse me, waiter. Could take this back? This soup tastes like _." + }, + { + "pick": 1, + "text": "Now on Netflix: Jiro Dreams of _." + }, + { + "pick": 2, + "text": "In line with our predictions, we find a robust correlation between _ and _ (p>.05)." + }, + { + "pick": 1, + "text": "In what's being hailed as a major breakthrough, scientists have synthesized _ in the lab." + }, + { + "pick": 1, + "text": "A study published in Nature this week found that _ is good for you in small doses." + }, + { + "pick": 2, + "text": "In an attempt to recreate conditions just after the Big Bang, physicists at the LHC are observing collisions between _ and _." + }, + { + "pick": 1, + "text": "What really killed the dinosaurs?" + }, + { + "pick": 1, + "text": "Hey there, Young Scientists! Put on your labcoats and strap on your safety goggles, because today we're learning about _!" + }, + { + "pick": 2, + "text": "Today on MythBusters, we found out how long _ can withstand _." + } + ], + "whiteCards": [ + "Coat hanger abortions.", + "Man meat.", + "Autocannibalism.", + "Vigorous jazz hands.", + "Flightless birds.", + "Pictures of boobs.", + "Doing the right thing.", + "The violation of our most basic human rights.", + "Viagra®.", + "Self-loathing.", + "Spectacular abs.", + "A balanced breakfast.", + "Roofies.", + "Concealing a boner.", + "Amputees.", + "The Big Bang.", + "Former President George W. Bush.", + "The Rev. Dr. Martin Luther King, Jr.", + "Smegma.", + "Being marginalized.", + "Cuddling.", + "Laying an egg.", + "The Pope.", + "Aaron Burr.", + "Genital piercings.", + "Fingering.", + "A bleached asshole.", + "Horse meat.", + "Fear itself.", + "Science.", + "Elderly Japanese men.", + "Stranger danger.", + "The terrorists.", + "Praying the gay away.", + "Same-sex ice dancing.", + "Ethnic cleansing.", + "Cheating in the Special Olympics.", + "German dungeon porn.", + "Bingeing and purging.", + "Making a pouty face.", + "William Shatner.", + "Heteronormativity.", + "Nickelback.", + "Tom Cruise.", + "The profoundly handicapped.", + "The placenta.", + "Chainsaws for hands.", + "Arnold Schwarzenegger.", + "An icepick lobotomy.", + "Goblins.", + "Object permanence.", + "Dying.", + "Foreskin.", + "A falcon with a cap on its head.", + "Hormone injections.", + "Dying of dysentery.", + "Sexy pillow fights.", + "The invisible hand.", + "A really cool hat.", + "Sean Penn.", + "Heartwarming orphans.", + "The clitoris.", + "The Three-Fifths compromise.", + "A sad handjob.", + "Men.", + "Historically black colleges.", + "A micropenis.", + "Raptor attacks.", + "Agriculture.", + "Vikings.", + "Pretending to care.", + "The Underground Railroad.", + "My humps.", + "Being a dick to children.", + "Geese.", + "Bling.", + "Sniffing glue.", + "The South.", + "An Oedipus complex.", + "Eating all of the cookies before the AIDS bake-sale.", + "Sexting.", + "YOU MUST CONSTRUCT ADDITIONAL PYLONS.", + "Mutually-assured destruction.", + "Sunshine and rainbows.", + "Count Chocula.", + "Sharing needles.", + "Being rich.", + "Skeletor.", + "A sausage festival.", + "Michael Jackson.", + "Emotions.", + "Farting and walking away.", + "The Chinese gymnastics team.", + "Necrophilia.", + "Spontaneous human combustion.", + "Yeast.", + "Leaving an awkward voicemail.", + "Dick Cheney.", + "White people.", + "Penis envy.", + "Teaching a robot to love.", + "Sperm whales.", + "Scrubbing under the folds.", + "Panda sex.", + "Whipping it out.", + "Catapults.", + "Masturbation.", + "Natural selection.", + "Opposable thumbs.", + "A sassy black woman.", + "AIDS.", + "The KKK.", + "Figgy pudding.", + "Seppuku.", + "Gandhi.", + "Preteens.", + "Toni Morrison's vagina.", + "Five-Dollar Footlongs™.", + "Land mines.", + "A sea of troubles.", + "A zesty breakfast burrito.", + "Christopher Walken.", + "Friction.", + "Balls.", + "Dental dams.", + "A can of whoop-ass.", + "A tiny horse.", + "Waiting 'til marriage.", + "Authentic Mexican cuisine.", + "Genghis Khan.", + "Old-people smell.", + "Feeding Rosie O'Donnell.", + "Pixelated bukkake.", + "Friends with benefits.", + "The token minority.", + "The Tempur-Pedic® Swedish Sleep System™.", + "A thermonuclear detonation.", + "Take-backsies.", + "The Rapture.", + "A cooler full of organs.", + "Sweet, sweet vengeance.", + "RoboCop.", + "Keanu Reeves.", + "Drinking alone.", + "Giving 110%.", + "Flesh-eating bacteria.", + "The American Dream.", + "Taking off your shirt.", + "Me time.", + "A murder most foul.", + "The inevitable heat death of the universe.", + "The folly of man.", + "That thing that electrocutes your abs.", + "Cards Against Humanity.", + "Fiery poops.", + "Poor people.", + "Edible underpants.", + "Britney Spears at 55.", + "All-you-can-eat shrimp for $4.99.", + "Pooping back and forth. Forever.", + "Fancy Feast®.", + "Jewish fraternities.", + "Being a motherfucking sorcerer.", + "Pulling out.", + "Picking up girls at the abortion clinic.", + "The homosexual agenda.", + "The Holy Bible.", + "Passive-agression.", + "Ronald Reagan.", + "Vehicular manslaughter.", + "Nipple blades.", + "Assless chaps.", + "Full frontal nudity.", + "Hulk Hogan.", + "Daddy issues.", + "The hardworking Mexican.", + "Natalie Portman.", + "Waking up half-naked in a Denny's parking lot.", + "God.", + "Sean Connery.", + "Saxophone solos.", + "Gloryholes.", + "The World of Warcraft.", + "Homeless people.", + "Scalping.", + "Darth Vader.", + "Eating the last known bison.", + "Guys who don't call.", + "Hot Pockets®.", + "A time travel paradox.", + "The milk man.", + "Testicular torsion.", + "Dropping a chandelier on your enemies and riding the rope up.", + "World peace.", + "A salty surprise.", + "Poorly-timed Holocaust jokes.", + "Smallpox blankets.", + "Licking things to claim them as your own.", + "The heart of a child.", + "Robert Downey, Jr.", + "Lockjaw.", + "Eugenics.", + "A good sniff.", + "Friendly fire.", + "The taint; the grundle; the fleshy fun-bridge.", + "Wearing underwear inside-out to avoid doing laundry.", + "Hurricane Katrina.", + "Free samples.", + "Jerking off into a pool of children's tears.", + "A foul mouth.", + "The glass ceiling.", + "Republicans.", + "Explosions.", + "Michelle Obama's arms.", + "Getting really high.", + "Attitude.", + "Sarah Palin.", + "The Übermensch.", + "Altar boys.", + "My soul.", + "My sex life.", + "Pedophiles.", + "72 virgins.", + "Pabst Blue Ribbon.", + "Domino's™ Oreo™ Dessert Pizza.", + "A snapping turtle biting the tip of your penis.", + "The Blood of Christ.", + "Half-assed foreplay.", + "My collection of high-tech sex toys.", + "A middle-aged man on roller skates.", + "Bitches.", + "Bill Nye the Science Guy.", + "Italians.", + "A windmill full of corpses.", + "Adderall™.", + "Crippling debt.", + "A stray pube.", + "Prancing.", + "Passing a kidney stone.", + "A brain tumor.", + "Leprosy.", + "Puppies!", + "Bees?", + "Frolicking.", + "Repression.", + "Road head.", + "A bag of magic beans.", + "An asymmetric boob job.", + "Dead parents.", + "Public ridicule.", + "A mating display.", + "A mime having a stroke.", + "Stephen Hawking talking dirty.", + "African children.", + "Mouth herpes.", + "Overcompensation.", + "Riding off into the sunset.", + "Being on fire.", + "Tangled Slinkys.", + "Civilian casualties.", + "Auschwitz.", + "My genitals.", + "Not reciprocating oral sex.", + "Lactation.", + "Being fabulous.", + "Shaquille O'Neal's acting career.", + "My relationship status.", + "Asians who aren't good at math.", + "Alcoholism.", + "Incest.", + "Grave robbing.", + "Hope.", + "8 oz. of sweet Mexican black-tar heroin.", + "Kids with ass cancer.", + "Winking at old people.", + "The Jews.", + "Justin Bieber.", + "Doin' it in the butt.", + "A lifetime of sadness.", + "The Hamburglar.", + "Swooping.", + "Classist undertones.", + "New Age music.", + "Not giving a shit about the Third World.", + "The Kool-Aid Man.", + "A hot mess.", + "Tentacle porn.", + "Lumberjack fantasies.", + "The gays.", + "Scientology.", + "Estrogen.", + "GoGurt®.", + "Judge Judy.", + "Dick fingers.", + "Racism.", + "Surprise sex!", + "Police brutality.", + "Passable transvestites.", + "The Virginia Tech Massacre.", + "When you fart and a little bit comes out.", + "Oompa-Loompas.", + "A fetus.", + "Obesity.", + "Tasteful sideboob.", + "Hot people.", + "BATMAN!!!", + "Black people.", + "A gassy antelope.", + "Sexual tension.", + "Third base.", + "Racially-biased SAT questions.", + "Porn stars.", + "A Super Soaker™ full of cat pee.", + "Muhammed (Praise Be Unto Him).", + "Puberty.", + "A disappointing birthday party.", + "An erection that lasts longer than four hours.", + "White privilege.", + "Getting so angry that you pop a boner.", + "Wifely duties.", + "Two midgets shitting into a bucket.", + "Queefing.", + "Wiping her butt.", + "Golden showers.", + "Barack Obama.", + "Nazis.", + "A robust mongoloid.", + "An M. Night Shyamalan plot twist.", + "Getting drunk on mouthwash.", + "Lunchables™.", + "Women in yogurt commercials.", + "John Wilkes Booth.", + "Powerful thighs.", + "Mr. Clean, right behind you.", + "Multiple stab wounds.", + "Cybernetic enhancements.", + "Serfdom.", + "Kanye West.", + "Women's suffrage.", + "Children on leashes.", + "Harry Potter erotica.", + "The Dance of the Sugar Plum Fairy.", + "Lance Armstrong's missing testicle.", + "Parting the Red Sea.", + "The Amish.", + "Dead babies.", + "Child beauty pageants.", + "AXE Body Spray.", + "Centaurs.", + "Copping a feel.", + "Grandma.", + "Famine.", + "The Trail of Tears.", + "The miracle of childbirth.", + "Finger painting.", + "A monkey smoking a cigar.", + "The Make-A-Wish® Foundation.", + "Anal beads.", + "The Force.", + "Kamikaze pilots.", + "Dry heaving.", + "Active listening.", + "Ghosts.", + "The Hustle.", + "Peeing a little bit.", + "Another goddamn vampire movie.", + "Shapeshifters.", + "The Care Bear Stare.", + "Hot cheese.", + "A mopey zoo lion.", + "A defective condom.", + "Teenage pregnancy.", + "A Bop It™.", + "Expecting a burp and vomiting on the floor.", + "Horrifying laser hair removal accidents.", + "Boogers.", + "Unfathomable stupidity.", + "Breaking out into song and dance.", + "Soup that is too hot.", + "Morgan Freeman's voice.", + "Getting naked and watching Nickelodeon.", + "MechaHitler.", + "Flying sex snakes.", + "The true meaning of Christmas.", + "My inner demons.", + "Pac-Man uncontrollably guzzling cum.", + "My vagina.", + "A homoerotic volleyball montage.", + "Actually taking candy from a baby.", + "Crystal meth.", + "Exactly what you'd expect.", + "Natural male enhancement.", + "Passive-aggressive Post-it notes.", + "Inappropriate yodeling.", + "Lady Gaga.", + "The Little Engine That Could.", + "Vigilante justice.", + "A death ray.", + "Poor life choices.", + "A gentle caress of the inner thigh.", + "Embryonic stem cells.", + "Nicolas Cage.", + "Firing a rifle into the air while balls deep in a squealing hog.", + "Switching to Geico®.", + "The chronic.", + "Erectile dysfunction.", + "Home video of Oprah sobbing into a Lean Cuisine®.", + "A bucket of fish heads.", + "50,000 volts straight to the nipples.", + "Being fat and stupid.", + "Hospice care.", + "A pyramid of severed heads.", + "Getting married, having a few kids, buying some stuff, retiring to Florida, and dying.", + "A subscription to Men's Fitness.", + "Crucifixion.", + "A micropig wearing a tiny raincoat and booties.", + "Some god-damn peace and quiet.", + "Used panties.", + "A tribe of warrior women.", + "The penny whistle solo from \"My Heart Will Go On.\"", + "An oversized lollipop.", + "Helplessly giggling at the mention of Hutus and Tutsis.", + "Not wearing pants.", + "Consensual sex.", + "Her Majesty, Queen Elizabeth II.", + "Funky fresh rhymes.", + "The art of seduction.", + "The Devil himself.", + "Advice from a wise, old black man.", + "Destroying the evidence.", + "The light of a billion suns.", + "Wet dreams.", + "Synergistic management solutions.", + "Growing a pair.", + "Silence.", + "An M16 assault rifle.", + "Poopy diapers.", + "A live studio audience.", + "The Great Depression.", + "A spastic nerd.", + "Rush Limbaugh's soft, shitty body.", + "Tickling Sean Hannity, even after he tells you to stop.", + "Stalin.", + "Brown people.", + "Rehab.", + "Capturing Newt Gingrich and forcing him to dance in a monkey suit.", + "Battlefield amputations.", + "An uppercut.", + "Shiny objects.", + "An ugly face.", + "Menstrual rage.", + "A bitch slap.", + "One trillion dollars.", + "Chunks of dead prostitute.", + "The entire Mormon Tabernacle Choir.", + "The female orgasm.", + "Extremely tight pants.", + "The Boy Scouts of America.", + "Stormtroopers.", + "Throwing a virgin into a volcano.", + "Getting in her pants, politely.", + "Gladiatorial combat.", + "Good grammar.", + "Hipsters.", + "Gandalf.", + "Genetically engineered super-soldiers.", + "George Clooney's musk.", + "Getting abducted by Peter Pan.", + "Eating an albino.", + "Enormous Scandinavian women.", + "Fabricating statistics.", + "Finding a skeleton.", + "Suicidal thoughts.", + "Dancing with a broom.", + "Deflowering the princess.", + "Dorito breath.", + "One thousand Slim Jims.", + "My machete.", + "Overpowering your father.", + "Ominous background music.", + "Media coverage.", + "Making the penises kiss.", + "Moral ambiguity.", + "Medieval Times® Dinner & Tournament.", + "Mad hacky-sack skills.", + "Just the tip.", + "Literally eating shit.", + "Leveling up.", + "Insatiable bloodlust.", + "Historical revisionism.", + "Jean-Claude Van Damme.", + "Jafar.", + "The boners of the elderly.", + "The economy.", + "Statistically validated stereotypes.", + "Sudden Poop Explosion Disease.", + "Slow motion.", + "Space muffins.", + "Sexual humiliation.", + "Sexy Siamese twins.", + "Santa Claus.", + "Scrotum tickling.", + "Ripping into a man's chest and pulling out his still-beating heart.", + "Ryan Gosling riding in on a white horse.", + "Quivering jowls.", + "Revenge fucking.", + "Pistol-whipping a hostage.", + "Quiche.", + "Zeus's sexual appetites.", + "Words, words, words.", + "Tripping balls.", + "Being a busy adult with many important things to do.", + "The four arms of Vishnu.", + "The shambling corpse of Larry King.", + "The hiccups.", + "The harsh light of day.", + "The Gulags.", + "The Fanta® girls.", + "A big black dick.", + "A beached whale.", + "A low standard of living.", + "A nuanced critique.", + "A bloody pacifier.", + "A crappy little hand.", + "Shaft.", + "Being a dinosaur.", + "Beating your wives.", + "Neil Patrick Harris.", + "Coughing into a vagina.", + "Carnies.", + "Nubile slave boys.", + "Bosnian chicken farmers.", + "A web of lies.", + "A rival dojo.", + "A passionate Latino lover.", + "Panty raids.", + "Appreciative snapping.", + "Apologizing.", + "Clams.", + "A woman scorned.", + "Being awesome at sex.", + "Spring break!", + "Another shot of morphine.", + "Dining with cardboard cutouts of the cast of \"Friends.\"", + "A soulful rendition of \"Ol' Man River.\"", + "Making a friend.", + "A sweaty, panting leather daddy.", + "Intimacy problems.", + "The new Radiohead album.", + "Pretty Pretty Princess Dress-Up Board Game®.", + "A man in yoga pants with a ponytail and feather earrings.", + "An army of skeletons.", + "A squadron of moles wearing aviator goggles.", + "Beefin' over turf.", + "The Google.", + "Bullshit.", + "A sweet spaceship.", + "A 55-gallon drum of lube.", + "Special musical guest, Cher.", + "The human body.", + "Mild autism.", + "Nunchuck moves.", + "Whipping a disobedient slave.", + "An ether-soaked rag.", + "Oncoming traffic.", + "A dollop of sour cream.", + "A slightly shittier parallel universe.", + "My first kill.", + "Boris the Soviet Love Hammer.", + "The grey nutrient broth that sustains Mitt Romney.", + "Tiny nipples.", + "Power.", + "Death by Steven Seagal.", + "A Burmese tiger pit.", + "Basic human decency.", + "Grandpa's ashes.", + "One Ring to rule them all.", + "The day the birds attacked.", + "Fetal alcohol syndrome.", + "Graphic violence, adult language, and some sexual content.", + "A bigger, blacker dick.", + "The mere concept of Applebee's®.", + "A sad fat dragon with no friends.", + "A piñata full of scorpions.", + "Existing.", + "Hillary Clinton's death stare.", + "Catastrophic urethral trauma.", + "Double penetration.", + "Daddy's belt.", + "Swiftly achieving orgasm.", + "Mooing.", + "Rising from the grave.", + "Subduing a grizzly bear and making her your wife.", + "Some really fucked-up shit.", + "Weapons-grade plutonium.", + "All of this blood.", + "Scrotal frostbite.", + "Taking a man's eyes and balls out and putting his eyes where his balls go and then his balls in the eye holes.", + "The mixing of the races.", + "Pumping out a baby every nine months.", + "Tongue.", + "Loki, the trickster god.", + "Whining like a little bitch.", + "Wearing an octopus for a hat.", + "An unhinged ferris wheel rolling toward the sea.", + "Finding Waldo.", + "Upgrading homeless people to mobile hotspots.", + "A magic hippie love cloud.", + "Fuck Mountain.", + "Living in a trashcan.", + "The corporations.", + "Getting hilariously gang-banged by the Blue Man Group.", + "Jeff Goldblum.", + "Survivor's guilt.", + "Me.", + "All my friends dying.", + "Shutting the fuck up.", + "An ass disaster.", + "Some kind of bird-man.", + "The entire Internet.", + "Going around punching people.", + "A boo-boo.", + "Indescribable loneliness.", + "Having sex on top of a pizza.", + "Chugging a lava lamp.", + "Warm, velvety muppet sex.", + "Running naked through a mall, pissing and shitting everywhere.", + "Nothing.", + "Samuel L. Jackson.", + "Self-flagellation.", + "The systematic destruction of an entire people and their way of life.", + "The Quesadilla Explosion Salad™ from Chili's®.", + "Reverse cowgirl.", + "Vietnam flashbacks.", + "Actually getting shot, for real.", + "Not having sex.", + "Cock.", + "Dying alone and in pain.", + "A cop who is also a dog.", + "The way white people is.", + "Gay aliens.", + "The primal, ball-slapping sex your parents are having right now.", + "A cat video so cute that your eyes roll back and your spine slides out of your anus.", + "A lamprey swimming up the toilet and latching onto your taint.", + "Slapping a racist old lady.", + "A black male in his early 20s, last seen wearing a hoodie.", + "Jumping out at people.", + "Three months in the hole.", + "Blood farts.", + "The Land of Chocolate.", + "A botched circumcision.", + "My manservant, Claude.", + "Vomiting mid-blowjob.", + "Letting everyone down.", + "Having shotguns for legs.", + "Bill Clinton, naked on a bearskin rug with a saxophone.", + "Mufasa's death scene.", + "The Harlem Globetrotters.", + "Demonic possession.", + "Fisting.", + "The thin veneer of situational causality that underlies porn.", + "Girls that always be textin'.", + "Blowing some dudes in an alley.", + "A spontaneous conga line.", + "A vagina that leads to another dimension.", + "Disco fever.", + "Getting your dick stuck in a Chinese finger trap with another dick.", + "Drinking ten 5-hour ENERGYs® to get fifty continuous hours of energy.", + "Sneezing, farting, and coming at the same time.", + "Some douche with an acoustic guitar.", + "Spending lots of money.", + "Putting an entire peanut butter and jelly sandwich into the VCR.", + "An unstoppable wave of fire ants.", + "A greased-up Matthew McConaughey.", + "Flying robots that kill people.", + "Unlimited soup, salad, and breadsticks.", + "Crying into the pages of Sylvia Plath.", + "The moist, demanding chasm of his mouth.", + "Filling every orifice with butterscotch pudding.", + "An all-midget production of Shakespeare's Richard III.", + "Screaming like a maniac.", + "Not contributing to society in any meaningful way.", + "A pile of squirming bodies.", + "Buying the right pants to be cool.", + "Roland the Farter, flatulist to the king.", + "That ass.", + "A surprising amount of hair.", + "Eating Tom Selleck's mustache to gain his powers.", + "Velcro™.", + "A PowerPoint presentation.", + "Crazy opium eyes.", + "10 Incredible Facts About the Anus.", + "An interracial handshake.", + "Moderate-to-severe joint pain.", + "Finally finishing off the Indians.", + "Sugar madness.", + "Actual mutants with medical conditions and no superpowers.", + "The secret formula for ultimate female satisfaction.", + "The complex geopolitical quagmire that is the Middle East.", + "Fucking a corpse back to life.", + "Neil Diamond's Greatest Hits.", + "Calculating every mannerism so as not to suggest homosexuality.", + "Whatever a McRib® is made of.", + "No clothes on, penis in vagina.", + "All the single ladies.", + "Whispering all sexy.", + "How awesome I am.", + "Ass to mouth.", + "Smoking crack, for instance.", + "Falling into the toilet.", + "A dance move that's just sex.", + "The size of my penis.", + "Some sort of Asian.", + "A hopeless amount of spiders.", + "Party Mexicans.", + "Drinking responsibly.", + "The safe word.", + "Angelheaded hipsters burning for the ancient heavenly connection to the starry dynamo in the machinery of night.", + "Bouncing up and down.", + "Jizz.", + "Ambiguous sarcasm.", + "A shiny rock that proves I love you.", + "Dem titties.", + "My worthless son.", + "Exploding pigeons.", + "A Ugandan warlord.", + "My sex dungeon.", + "A kiss on the lips.", + "Child Protective Services.", + "A Native American who solves crimes by going into the spirit world.", + "Doo-doo.", + "The peaceful and nonthreatening rise of China.", + "Sports.", + "A fart.", + "Unquestioning obedience.", + "Three consecutive seconds of happiness.", + "Grammar nazis who are also regular Nazis.", + "Snorting coke off a clown's boner.", + "Africa.", + "Depression.", + "A horse with no legs.", + "The euphoric rush of strangling a drifter.", + "Khakis.", + "Interspecies marriage.", + "A gender identity that can only be conveyed through slam poetry.", + "Almost giving money to a homeless person.", + "Stuff a child's face with Fun Dip® until he starts having fun.", + "What Jesus would do.", + "A for-real lizard that spits blood from its eyes.", + "Blackula.", + "The tiniest shred of evidence that God is real.", + "My dad's dumb fucking face.", + "Prince Ali,
fabulous he,
Ali Ababwa.", + "A manhole.", + "A sex goblin with a carnival penis.", + "A bunch of idiots playing a card game instead of interacting like normal humans.", + "A sex comet from Neptune that plunges the Earth into eternal sexiness.", + "Sharks with legs.", + "Injecting speed into one arm and horse tranquilizer into the other.", + "Lots and lots of abortions.", + "Seeing things from Hitler's perspective", + "Too much cocaine.", + "Doing the right stuff to her nipples.", + "Giant sperm from outer space.", + "Oil!", + "Ennui.", + "A powered exoskeleton.", + "A disappointing salad.", + "Mom's new boyfriend.", + "Unrelenting genital punishment.", + "Denzel.", + "The swim team, all at once.", + "The eight gay warlocks who dictate the rules of fashion.", + "Being nine years old.", + "The unbelievable world of mushrooms.", + "The Abercrombie & Fitch lifestyle.", + "Vegetarian options.", + "My first period.", + "Having been dead for a while.", + "Backwards knees.", + "Being paralyzed from the neck down.", + "Seeing my village burned and my family slaughtered before my eyes.", + "A zero-risk way to make $2,000 from home.", + "A crazy little thing called love.", + "Ancient Athenian boy-fucking", + "Out-of-this-world bazongas.", + "The ghost of Marlon Brando.", + "The basic suffering that pervades all of existence.", + "Being worshipped as the one true God.", + "Figuring out how to have sex with a dolphin.", + "All these decorative pillows.", + "A mouthful of potato salad.", + "Russian super-tuberculosis.", + "A reason not to commit suicide.", + "Going to a high school reunion on ketamine.", + "The passage of time.", + "Child support payments.", + "Changing a person's mind with logic and facts.", + "My boyfriend's stupid penis.", + "The tiger that killed my father.", + "Genghis Khan's DNA.", + "Boring vaginal sex.", + "40 acres and a mule.", + "A whole new kind of porn.", + "Slowly easing down onto a cucumber.", + "Wearing glasses and sounding smart.", + "AIDS monkeys.", + "A team of lawyers.", + "Getting drive-by shot.", + "Not believing in giraffes.", + "Anal fissures like you wouldn't believe.", + "A giant powdery manbaby.", + "Cutting off a flamingo's legs with garden shears.", + "P.F. Chang himself.", + "An uninterrupted history of imperialism and exploitation.", + "A one-way ticket to Gary, Indiana.", + "Daddy's credit card.", + "September 11th, 2001.", + "An unforgettable quinceañera.", + "Deez nuts.", + "Social justice warriors with flamethrowers of compassion.", + "Some shit-hot guitar licks.", + "Butt stuff.", + "Blackface.", + "Blowjobs for everyone.", + "Getting eaten alive by Guy Fieri.", + "Western standards of beauty.", + "Ejaculating live bees and the bees are angry.", + "My dead son's baseball glove.", + "Getting caught by the police and going to jail.", + "A face full of horse cum.", + "Free ice cream, yo.", + "The white half of Barack Obama.", + "The black half of Barack Obama.", + "An inability to form meaningful relationships.", + "A bass drop so huge it tears the starry vault asunder to reveal the face of God.", + "Growing up chained to a radiator in perpetual darkness.", + "Shitting all over the floor like a bad, bad girl.", + "A buttload of candy.", + "Sucking all the milk out of a yak.", + "Bullets.", + "A man who is so cool that he rides on a motorcycle.", + "Sudden penis loss.", + "Getting all offended.", + "Crying and shitting and eating spaghetti.", + "One unforgettable night of passion.", + "Being popular and good at sports.", + "Filling a man's anus with concrete.", + "Two whales fucking the shit out of eachother.", + "Cool, relateable cancer teens.", + "The amount of gay I am.", + "A possible Muslim.", + "Unsheathing my massive horse cock.", + "A bowl of gourds.", + "The male gaze.", + "The power of the Dark Side.", + "Ripping a dog in half.", + "A constant need for validation.", + "Meaningless sex.", + "Such a big boy.", + "Throwing stones at a man until he dies.", + "Cancer.", + "Like a million alligators.", + "Eating together like a god damn family for once.", + "Cute boys.", + "Pussy.", + "Being a terrible mother.", + "Never having sex again.", + "A pizza guy who fucked up.", + "A whole lotta woman.", + "The all-new Nissan Pathfinder with 0.9% APR financing!", + "A peyote-fueled vision quest.", + "Kale.", + "Breastfeeding a ten year old.", + "Crippling social anxiety.", + "Immortality cream.", + "Texas.", + "Teaching a girl how to handjob the penis.", + "A turd.", + "Shapes and colors.", + "Whatever you wish, mother.", + "The haunting stare of an Iraqi child.", + "Robots who just want to party.", + "A self-microwaving burrito.", + "Forgetting grandma's first name.", + "Our new Buffalo Chicken Dippers®!", + "Treasures beyond your wildest dreams.", + "Getting shot out of a cannon.", + "The sweet song of sword against and the braying of mighty war beasts.", + "Walking into a glass door.", + "The color \"puce\".", + "Every ounce of charisma left in Mick Jagger's tired body.", + "The eighth graders.", + "Setting my balls on fire and cartwheeling to Ohio.", + "The dentist.", + "Gwyneth Paltrow's opinions.", + "Turning the rivers red with the blood of infidels.", + "Rabies.", + "Important news about Taylor Swift.", + "Ejaculating inside another man's wife.", + "Owls, the perfect predator.", + "Being John Malkovich.", + "Bathing in moonsblood and dancing around the ancient oak.", + "An oppressed people with a vibrant culture.", + "An overwhelming variety of cheeses.", + "Reading the entire End-User License Agreement.", + "Morpheus.", + "Peeing into a girl's butt to make a baby.", + "Generally having no idea of what's going on.", + "No longer finding any Cards Against Humanity card funny.", + "10 football players with erections barreling towards you at full speed.", + "10,000 shrieking teenage girls.", + "A big ol' plate of fettuccine alfredo.", + "A big, beautiful mouth packed to the brim with sparkling teeth.", + "A black friend.", + "A burrito that's just sour cream.", + "A cheerfulness that belies a deep-seated self-loathing.", + "A cold and indifferent universe.", + "A creature made of penises that must constantly arouse itself to survive.", + "A creepy child singing a nursery rhyme.", + "A dolphin that learns to talk and becomes the Dead of Harvard Law School.", + "A duffel bag full of lizards.", + "A finger up the butt.", + "A genetic predisposition for alcoholism.", + "A gun that shoots cobras.", + "A hug.", + "A long business meeting with no obvious purpose.", + "A man in a suit with perfect hair who tells you beautiful lies.", + "A man with the head of a goat and the body of a goat.", + "A massive collection of child pornography.", + "A medium horchata.", + "A negative body image that is totally justified.", + "A slowly encroaching circle of wolves.", + "A strong horse and enough rations for thirty days.", + "A terrified fat child who won't come out of the bushes.", + "A tiny fireman who puts out tiny fires.", + "A weird guy who says weird stuff and weirds me out.", + "A woman's right to choose.", + "A woman's perspective.", + "Aborting the shit out of a fetus.", + "Albert Einstein but if he had a huge muscles and a rhinoceros cock.", + "All these people I've killed.", + "An arrangement wherein I give a person money they have sex with me.", + "An empowered woman.", + "An incurable homosexual.", + "An old dog full of tumors.", + "An older man.", + "An X-Man whose power is that he has sex with dogs and children.", + "Anal.", + "Antidepressants.", + "Art.", + "Assassinating the president.", + "Awesome pictures of planets and stuff.", + "Bad emotions I don't want.", + "Becoming the President of the United States.", + "Being sexually attracted to children.", + "Being turned into sausages.", + "Beyoncé.", + "Big, smart money boys tap-tapping on their keyboards.", + "Blossoming into a beautiful young woman.", + "Breastfeeding in public like a radiant earth goddess.", + "Brunch.", + "Catching a live salmon in your mouth.", + "Child labor.", + "China.", + "Chipotle.", + "Chris Hemsworth.", + "Comprehensive immigration reform.", + "Condoleezza Rice.", + "Consensual, nonreproductive incest.", + "Content.", + "Crazy anal orgasms.", + "Creamy slices of real, California avocado.", + "Critical thinking.", + "Crushing the patriarchy.", + "Daddy going away forever.", + "Defeating a gorilla in single combat.", + "Denying the Holocaust.", + "Dis bitch.", + "Discovering that what I really want in life is to kill people and have sex with their corpses.", + "Doing a somersault and barfing.", + "Dominating a man by peeing on his eldest son.", + "Doritos and a Fruit Roll-Up.", + "Dropping dead in a Sbarro's bathroom and not being found for 72 hours.", + "Dumpster juice.", + "Eating ass.", + "Eating people.", + "Eating too many Cinnabons and then vomiting and then eating the vomit.", + "Ejaculating at the apex of a cartwheel.", + "Esmeralda, my most beautiful daughter.", + "Eternal screaming madness.", + "Every man's ultimate fantasy: a perfectly cylindrical vagina.", + "Everything.", + "Exploring each other's buttholes.", + "Facilitating dialogue and deconstructing binaries.", + "Falling into a pit of waffles.", + "Farting a huge shit out of my pussy.", + "Farting all over my face with your tight little asshole.", + "Feeling the emotion of anger.", + "Feminism.", + "Film roles for actresses over 40.", + "Finding a nice elevator to poop in.", + "Forty-five minutes of finger blasting.", + "Founding a major world religion.", + "Fucking me good and taking me to Red Lobster®.", + "Fucking my therapist.", + "Gary.", + "Gay thoughts.", + "Gayle from HR.", + "Gazpacho.", + "Getting aborted.", + "Getting blasted in the face by a t-shirt cannon.", + "Getting eaten out by a dog.", + "Getting high with mom.", + "Getting killed and dragged up a tree by a leopard.", + "Getting laid like all the time.", + "Getting naked too soon.", + "Getting pegged.", + "Getting the Dorito crumbs out of my purse.", + "Getting this party started!", + "Getting trapped in a conversation about Ayn Rand.", + "Going around pulling people's tampons out.", + "Going to bed at a reasonable hour.", + "Gregor, my largest son.", + "Grunting for ten minutes and then peeing sand.", + "Guns.", + "Happy daddies with happy sandals.", + "Hating Jews.", + "Having a vagina.", + "Having an awesome time drinking and driving.", + "Having sex with a beautiful person.", + "Having sex with a man and then eating his head.", + "Having sex with your mom.", + "Holding the proper political beliefs of my time to attract a mate.", + "Homework.", + "Hot lettuce.", + "How good lead paint taste.", + "How great my ass looks in these jeans.", + "How sad it will be when Morgan Freeman dies.", + "How strange it is to be anything at all.", + "Huge big balls full of jizz.", + "Informing you that I am a registered sex offender.", + "ISIS.", + "It being too late to stop having sex with a horse.", + "Jason, the teen mayor.", + "Jazz.", + "Just now finding out about the Armenian Genocide.", + "Late-stage dementia.", + "Libertarians.", + "Loud, scary thunder.", + "Making out and stuff.", + "Math.", + "Meatloaf, the food.", + "Meatloaf, the man.", + "Menopause.", + "Mental illness.", + "Microaggressions.", + "Misogyny.", + "Mixing M&Ms and Skittles like some kind of psychopath.", + "Mommy and daddy fighting all the time.", + "Moon people.", + "Muchin' puss.", + "My brother's hot friends.", + "My dog dying.", + "My huge penis and substantial fortune.", + "Objectifying women.", + "One of them big-city Jew lawyers.", + "One of those \"blow jobs\" I've been hearing so much about.", + "Onions.", + "Opening your mouth to talk and a big penis fops out.", + "Our baby.", + "Out-of-control teenage blowjob parties.", + "Overthrowing the democratically-elected government of Chile.", + "Participating.", + "Period poops.", + "Picking up a glass of water and taking a sip and being the president.", + "Playing my asshole like a trumpet.", + "Plowing that ass like a New England corn farmer.", + "Political correctness.", + "Pooping in a leotard and hoping no one notices.", + "Pooping in the potty.", + "Prematurely ejaculating like a total loser.", + "Pretending to be one of the guys but actually being the spider god.", + "Putting more black people in jail.", + "Quacking like a duck in lieu of a cogent argument.", + "Quinoa.", + "Raising three kids on minimum wage.", + "Reaching an age where barbecue chips are better than sex.", + "Regurgitating a half-digested sparrow.", + "Restoring Germany to its former glory.", + "Rock-hard tits and a huge vagina.", + "Rolling so hard.", + "Rubbing my bush all over your bald head.", + "Salsa Night at Dave's Cantina.", + "Scissoring, if that's a thing.", + "Seizing control of the means of production.", + "Self-identifying as a DJ.", + "Showing all the boys my pussy.", + "Slamming a dunk.", + "Smashing my balls at the moment of climax.", + "Some of that good dick.", + "Some real spicy shrimps.", + "Starting a shitty podcast.", + "Straight blazin' 24/7.", + "Sucking each other's penises for hours on end.", + "Sudden and unwanted slam poetry.", + "Swearing praise upon the Sultan's hideous daughters.", + "Systems and policies designed to preserve centuries-old power structures.", + "Tables.", + "Taking the form of a falcon.", + "Tender chunks of all-white-meat chicken.", + "That bitch, Stacy.", + "The amount of baby carrots I can fit up my ass.", + "The best, deepest quotes from The Dark Knight.", + "The body of a 46-year-old man.", + "The bond between a woman and her horse.", + "The chicken from Popeyes®.", + "The clown that followed me home from the grocery store.", + "The fear and hatred in men's hearts.", + "The feeling of going to McDonald's as a 6-year-old.", + "The flaming wreckage of the International Space Station.", + "The full blown marginalization of ugly people.", + "The full force of the American military.", + "The government.", + "The graceful path of an autumn leaf as it falls to its earthen cradle.", + "The hottest MILF in Dallas.", + "The LGBT community.", + "The lived experience of African Americans.", + "The mysterious fog rolling into town.", + "The ol' penis-in-the-popcorn surprise.", + "The Rwandan Genocide.", + "The secret to truly resilient hair.", + "The sweet, forbidden meat of the monkey.", + "The wind.", + "Thinking about what eating even is.", + "Three hours of nonstop penetration.", + "Tiny, rancid girl farts.", + "Trees.", + "Trevor, the world's greatest boyfriend.", + "Turning 32.", + "Twenty bucks.", + "Twenty cheerleaders laughing at your tiny penis.", + "Twisting my cock and balls into a balloon poodle.", + "Two beautiful pig sisters.", + "Two shitty kids and a garbage husband.", + "Waking up inside of a tornado.", + "Watching a hot person eat.", + "Watching you die.", + "Water.", + "When the big truck goes \"Toot! Toot!\"", + "Who really did 9/11.", + "Whomsoever let the dogs out.", + "Whooping your ass at Mario Kart.", + "Working so hard to have muscles and then having them.", + "You.", + "Several Michael Keatons.", + "A bus that will explode if it goes under 50 miles per hour.", + "Sucking the President's dick.", + "Sunny D! Alright!", + "A mulatto, an albino, a mosquito, and my libido.", + "Log™.", + "Jerking off to a 10-second RealMedia clip.", + "The Y2K bug.", + "Deregulating the mortgage market.", + "Stabbing the shit out of a Capri Sun.", + "Wearing Nicolas Cage's face.", + "Freeing Willy.", + "Kurt Cobain's death.", + "The Great Cornholio.", + "Liking big butts and not being able to lie about it.", + "Yelling \"girl power!\" and doing a high kick.", + "Pure Moods, Vol. 1.", + "Pizza in the morning, pizza in the evening, pizza at supper time.", + "Pamela Anderson's boobs running in slow motion.", + "Getting caught up in the CROSSFIRE™.", + "Angels interfering in an otherwise fair baseball game.", + "Cool 90s up-in-the-front hair.", + "Patti Mayonnaise.", + "The biggest, blackest dick.", + "A box within a box.", + "A boxing match with a giant box.", + "A box.", + "Pandora's vagina.", + "Former President George W. Box.", + "Being a motherfucking box.", + "A falcon with a box on its head.", + "Two midgets shitting into a box.", + "A box without hinges, key, or lid, yet golden treasure inside is hid.", + "The J15 Patriot Assault Box.", + "An alternate universe in which boxes store things inside of people.", + "A box that is conscious and wishes it weren't a box.", + "Something that looks like a box but turns out to be a crate.", + "A man-shaped box.", + "A box-shaped man.", + "Boxing up my feelings.", + "A world without boxes.", + "The Boxcar Children.", + "An outbreak of smallbox.", + "A box of biscuits, a box of mixed biscuits, and a biscuit mixer.", + "A CGI dragon.", + "A dwarf who won't leave you alone until you compare penis sizes.", + "A gay sorcerer who turns everyone gay.", + "A ghoul.", + "A Hitachi Magic Wand.", + "A magical kingdom with dragons and elves and no black people.", + "A mysterious, floating orb.", + "A weed elemental who gets everyone high.", + "Accidentally conjuring a legless horse that can't stop ejaculating.", + "Bathing naked in a moonlit grove.", + "Dinosaurs who wear armor and you ride them and they kick ass.", + "Eternal darkness.", + "Freaky, pan-dimensional sex with a demigod.", + "Gender equality.", + "Going on an epic adventure and learning a valuable lesson about friendship.", + "Handcuffing a wizard to a radiator and dousing him with kerosene.", + "Hodor.", + "How hot Orlando Bloom was in Lord of the Rings.", + "Kneeing a wizard in the balls.", + "Make-believe stories for autistic white men,", + "Reading The Hobbit under the covers while mom and dad scream at each other downstairs.", + "Shitting in a wizard's spell book and jizzing in his hat.", + "Shooting a wizard with a gun.", + "The all-seeing Eye of Sauron.", + "The card game Neil Gaiman wrote: \"Three elves at a time.\"", + "True love's kiss.", + "A sobering quantity of chili cheese fries.", + "Going vegetarian and feeling so great all the time.", + "Kale farts.", + "Licking the cake batter off of grandma's fingers.", + "Real cheese flavor.", + "Swishing the wine around and sniffing it like a big fancy man.", + "The Dial-A-Slice Apple Divider from Williams-Sonoma.", + "What to do with all of this chocolate on my penis.", + "A belly full of hard-boiled eggs.", + "A joyless vegan patty.", + "A table for one at The Cheesecake Factory.", + "Being emotionally and physically dominated by Gordon Ramsay.", + "Kevin Bacon Bits.", + "Not knowing what to believe anymore about butter.", + "Soup that's better than pussy.", + "Sucking down thousands of pounds of krill every day.", + "A Mexican child trapped inside of a burrito.", + "Clamping down on a gazelle's jugular and tasting its warm life waters.", + "Committing suicide at the Old Country Buffet.", + "Father's forbidden chocolates.", + "Jizz Twinkies.", + "The Hellman's Mayonnaise Corporation.", + "The hot dog I put in my vagina ten days ago.", + "The inaudible screams of carrots.", + "A supermassive black hole.", + "Reconciling quantum theory with general relativity.", + "Electroejaculating a capuchin monkey.", + "Insufficient serotonin.", + "Evolving a labyrinthine vagina.", + "Getting really worried about global warming for a few seconds.", + "Infinity.", + "Oxytocin release via manual stimulation of the nipples.", + "Uranus.", + "Being knowledgeable in a narrow domain that nobody understands or cares about.", + "Achieving reproductive success.", + "Slowly evaporating.", + "The quiet majesty of the sea turtle.", + "A 0.7 waist-to-hip ratio.", + "Fun and interesting facts about rocks.", + "Photosynthesis.", + "Developing secondary sex characteristics.", + "Failing the Turing test.", + "Explosive decompression.", + "Driving into a tornado to learn about tornadoes.", + "David Attenborough watching us mate.", + "3.7 billion years of evolution.", + "The Sun engulfing the Earth." + ], + "Base": { + "name": "Base Set", + "black": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89 + ], + "white": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459 + ] + }, + "CAHe1": { + "name": "The First Expansion", + "black": [ + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109 + ], + "white": [ + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539 + ], + "icon": 1 + }, + "CAHe2": { + "name": "The Second Expansion", + "black": [ + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134 + ], + "white": [ + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614 + ], + "icon": 2 + }, + "CAHe3": { + "name": "The Third Expansion", + "black": [ + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159 + ], + "white": [ + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689 + ], + "icon": 3 + }, + "CAHe4": { + "name": "The Fourth Expansion", + "black": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189 + ], + "white": [ + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759 + ], + "icon": 4 + }, + "CAHe5": { + "name": "The Fifth Expansion", + "black": [ + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214 + ], + "white": [ + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834 + ], + "icon": 5 + }, + "CAHe6": { + "name": "The Sixth Expansion", + "black": [ + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239 + ], + "white": [ + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909 + ], + "icon": 6 + }, + "greenbox": { + "name": "Green Box Expansion", + "black": [ + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294 + ], + "white": [ + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030, + 1031, + 1032, + 1033, + 1034, + 1035, + 1036, + 1037, + 1038, + 1039, + 1040, + 1041, + 1042, + 1043, + 1044, + 1045, + 1046, + 1047, + 1048, + 1049, + 1050, + 1051, + 1052, + 1053, + 1054, + 1055, + 1056, + 1057, + 1058, + 1059, + 1060, + 1061, + 1062, + 1063, + 1064, + 1065, + 1066, + 1067, + 1068, + 1069, + 1070, + 1071, + 1072, + 1073, + 1074, + 1075, + 1076, + 1077, + 1078, + 1079, + 1080, + 1081, + 1082, + 1083, + 1084, + 1085, + 1086, + 1087, + 1088, + 1089, + 1090, + 1091, + 1092, + 1093, + 1094, + 1095, + 1096, + 1097, + 1098, + 1099, + 1100, + 1101, + 1102, + 1103, + 1104, + 1105, + 1106, + 1107, + 1108, + 1109, + 1110, + 1111, + 1112, + 1113, + 1114, + 1115, + 1116, + 1117, + 1118, + 1119, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1134, + 1135, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154 + ], + "icon": "square" + }, + "90s": { + "name": "90s Nostalgia Pack", + "black": [ + 295, + 296, + 297, + 298, + 299, + 300, + 301 + ], + "white": [ + 1155, + 1156, + 1157, + 1158, + 1159, + 1160, + 1161, + 1162, + 1163, + 1164, + 1165, + 1166, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177 + ], + "icon": "birthday-cake" + }, + "Box": { + "name": "Box Expansion", + "black": [], + "white": [ + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1184, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198 + ], + "icon": "cube" + }, + "fantasy": { + "name": "Fantasy Pack", + "black": [ + 302, + 303, + 304, + 305, + 306, + 307 + ], + "white": [ + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1216, + 1217, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224 + ], + "icon": "magic" + }, + "food": { + "name": "Food Pack", + "black": [ + 308, + 309, + 310, + 311, + 312, + 313 + ], + "white": [ + 1225, + 1226, + 1227, + 1228, + 1229, + 1230, + 1231, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248 + ], + "icon": "cutlery" + }, + "science": { + "name": "Science Pack", + "black": [ + 314, + 315, + 316, + 317, + 318, + 319, + 320 + ], + "white": [ + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1257, + 1258, + 1259, + 1260, + 1261, + 1262, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 1269, + 1270, + 1271 + ], + "icon": "flask" + }, + "order": [ + "Base", + "CAHe1", + "CAHe2", + "CAHe3", + "CAHe4", + "CAHe5", + "CAHe6", + "greenbox", + "90s", + "Box", + "fantasy", + "food", + "science" + ] +} \ No newline at end of file diff --git a/cards_against_emf/main.py b/cards_against_emf/main.py new file mode 100644 index 0000000..75b0c21 --- /dev/null +++ b/cards_against_emf/main.py @@ -0,0 +1,58 @@ +''' Random card generator, includes Base Set, The First Expansion, The Second Expansion, The Third Expansion, The Fourth Expansion, The Fifth Expansion, The Sixth Expansion, Green Box Expansion, 90s Nostalgia Pack, Box Expansion, Fantasy Pack, Food Pack, Science Pack and World Wide Web Pack ''' + +___name___ = "Cards Against EMF" +___license___ = ["MIT"] +___dependencies___ = ["random", "ugfx_helper", "sleep"] +___categories___ = ["Games"] +___bootstrapped___ = False # Whether or not apps get downloaded on first install. Defaults to "False", mostly likely you won't have to use this at all. + +import ugfx, json, random + +from tilda import Buttons +from app import restart_to_default + +ugfx.init() +ugfx.clear() +ugfx.text(10, 10, "CARDS AGAINST EMF", ugfx.BLACK) +ugfx.text(10, 40, "A for a question", ugfx.BLACK) +ugfx.text(10, 60, "B for an answer", ugfx.BLACK) +ugfx.text(10, 80, "MENU to exit", ugfx.BLACK) + +b=ugfx.Style() +b.set_background(ugfx.BLACK) +b.set_enabled([ugfx.WHITE, ugfx.BLACK, ugfx.BLACK, ugfx.BLACK]) # sets the style for when something is enabled +w=ugfx.Style() +w.set_background(ugfx.WHITE) + +with open("cards_against_emf/cards.json") as data: + d = json.load(data) + +def get_black(): + x = random.randint(1, 320) + ugfx.clear(ugfx.html_color(0x000000)) + text = str(d["blackCards"][x]["text"]) + ugfx.Label(0, 0, 240, 400, text, style=b) + +def get_white(): + y = random.randint(1, 1271) + ugfx.clear(ugfx.html_color(0xffffff)) + text = str(d["whiteCards"][y]) + ugfx.Label(0, 0, 240, 400, text, style=w) + +Buttons.enable_interrupt( + Buttons.BTN_A, + lambda button_id:get_black(), + on_press=True, + on_release=False) + +Buttons.enable_interrupt( + Buttons.BTN_B, + lambda button_id:get_white(), + on_press=True, + on_release=False) + +Buttons.enable_interrupt( + Buttons.BTN_Menu, + lambda button_id:restart_to_default(), + on_press=True, + on_release=False) \ No newline at end of file From 9b916093e43e192c0f4f2bc7a8b5cab817eebea8 Mon Sep 17 00:00:00 2001 From: "mjt@mjturner.co.uk" Date: Sun, 2 Sep 2018 23:06:18 +0100 Subject: [PATCH 04/26] Orbs Game --- orbs/main.py | 144 ++++++++++++++++++++++++++++++ orbs/umqtt/robust.py | 43 +++++++++ orbs/umqtt/simple.py | 204 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 391 insertions(+) create mode 100644 orbs/main.py create mode 100644 orbs/umqtt/robust.py create mode 100644 orbs/umqtt/simple.py diff --git a/orbs/main.py b/orbs/main.py new file mode 100644 index 0000000..1fe5929 --- /dev/null +++ b/orbs/main.py @@ -0,0 +1,144 @@ +___name___ = "Orbs Game" +___license___ = "MIT" +___dependencies___ = ["app", "dialogs", "sim800", "ugfx_helper"] +___categories___ = ["Games"] +___bootstrapped___ = True + +from app import * +from dialogs import * +import utime +import ugfx +import ugfx_helper +from orbs.umqtt.simple import MQTTClient +import network +from machine import mem32 +wlan=network.WLAN() +if not wlan.isconnected(): + import wifi + wifi.connect() + +ugfx_helper.init() +ugfx.clear() +broker='151.216.207.139' +mqtt_username='orbs' +mqtt_password='orbs123' +scoretext="" + +MACAddress=str(mem32[0x400fef20]) + str(mem32[0x400fef24]) + str(mem32[0x400fef28]) + str(mem32[0x400fef2C]) +regOK=False +regFAILED=False + +def mqtt_connect(): + client = MQTTClient(MACAddress,broker, user=mqtt_username, password=mqtt_password) + client.set_callback(sub_cb) + connected=False + try: + client.connect() + connected=True + except Exception as err: + connected=False + if (connected): + return client + else: + return False + +def sub_cb(topic,msg): + global regOK + global regFAILED + global scoretext + try: + (t1,t2,t3,targetBadge,messageType)=topic.decode('utf-8').split('/') + strmsg=msg.decode('utf-8') + if messageType=="regok": + regOK=True + if messageType=="regerror": + regFAILED=True + if messageType=="scores": + scoretext=msg + except: + return + + +def update_token(token): + lb=open("token.txt","w") + lb.write(token) + lb.close() + +def do_gettoken(): + notice("Enter your RFID token ID digits only. Get it right!", title="Orbs Game") + token=prompt_text("Enter token:") + if len(token)==8 or len(token)==14 or len(token)==20: + return token + else: + notice("Invalid token", title="Orbs Game") + return "" + +def do_register(client): + playername=prompt_text("Enter name:") + playername=playername.replace(",",".") + regOK==False + regFAILED==False + if len(playername)>3: + client.publish("/registration/from/" + MACAddress + "/name",mytoken + "," + playername) + notice("Name request sent") + client.check_msg() + if regOK==True: + notice("Registration completed") + if regFAILED==True: + notice("Registration failed") + else: + notice("Name too short") + +def get_token(): + try: + lb=open("token.txt","r") + token=lb.readline() + lb.close() + if token=="": + token=do_gettoken() + except: + token="" + if token=="": + token=do_gettoken() + return token + +def do_showscores(client): + client.publish("/registration/from/" + MACAddress + "/score",mytoken) + notice("Requested scores") + client.check_msg() + if len(scoretext)>0: + (playername,playerscore,rank,redscore,greenscore,bluescore)=scoretext.decode('utf-8').split(',') + notice("Player: " + playername + chr(13) + "Score: " + playerscore + chr(13) + "Rank: " + rank) + notice("Red Score: " + redscore + chr(13) + "Green Score: " + greenscore + chr(13) + "Blue Score: " + bluescore) + else: + notice("Failed to get scores") + +mqttclient=mqtt_connect() +while (not mqttclient): + utime.sleep(2) + mqttclient=mqtt_connect() +mqttclient.subscribe(topic='/badge/to/' + MACAddress + '/#') +#mqttclient.subscribe(topic='/scoreboard/to/all/#') +mytoken=get_token() +if len(mytoken)==0: + notice("Token required",title="Orbs Game") + try: + mqttclient.close() + except: + restart_to_default() + restart_to_default() +update_token(mytoken) + + +menuset = [] +menuset.append({ "title" : "Register", "index" : 1 }) +menuset.append({ "title" : "Scores", "index" : 2 }) + +while True: + selection = prompt_option(menuset, text="Orbs Game", select_text="Select", none_text="Exit") + if (not selection): + restart_to_default() + elif (selection["index"]==1): + do_register(mqttclient) + elif (selection["index"]==2): + do_showscores(mqttclient) diff --git a/orbs/umqtt/robust.py b/orbs/umqtt/robust.py new file mode 100644 index 0000000..7ee40e0 --- /dev/null +++ b/orbs/umqtt/robust.py @@ -0,0 +1,43 @@ +import utime +from . import simple + +class MQTTClient(simple.MQTTClient): + + DELAY = 2 + DEBUG = False + + def delay(self, i): + utime.sleep(self.DELAY) + + def log(self, in_reconnect, e): + if self.DEBUG: + if in_reconnect: + print("mqtt reconnect: %r" % e) + else: + print("mqtt: %r" % e) + + def reconnect(self): + i = 0 + while 1: + try: + return super().connect(False) + except OSError as e: + self.log(True, e) + i += 1 + self.delay(i) + + def publish(self, topic, msg, retain=False, qos=0): + while 1: + try: + return super().publish(topic, msg, retain, qos) + except OSError as e: + self.log(False, e) + self.reconnect() + + def wait_msg(self): + while 1: + try: + return super().wait_msg() + except OSError as e: + self.log(False, e) + self.reconnect() diff --git a/orbs/umqtt/simple.py b/orbs/umqtt/simple.py new file mode 100644 index 0000000..8216fa5 --- /dev/null +++ b/orbs/umqtt/simple.py @@ -0,0 +1,204 @@ +import usocket as socket +import ustruct as struct +from ubinascii import hexlify + +class MQTTException(Exception): + pass + +class MQTTClient: + + def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0, + ssl=False, ssl_params={}): + if port == 0: + port = 8883 if ssl else 1883 + self.client_id = client_id + self.sock = None + self.server = server + self.port = port + self.ssl = ssl + self.ssl_params = ssl_params + self.pid = 0 + self.cb = None + self.user = user + self.pswd = password + self.keepalive = keepalive + self.lw_topic = None + self.lw_msg = None + self.lw_qos = 0 + self.lw_retain = False + + def _send_str(self, s): + self.sock.write(struct.pack("!H", len(s))) + self.sock.write(s) + + def _recv_len(self): + n = 0 + sh = 0 + while 1: + b = self.sock.read(1)[0] + n |= (b & 0x7f) << sh + if not b & 0x80: + return n + sh += 7 + + def set_callback(self, f): + self.cb = f + + def set_last_will(self, topic, msg, retain=False, qos=0): + assert 0 <= qos <= 2 + assert topic + self.lw_topic = topic + self.lw_msg = msg + self.lw_qos = qos + self.lw_retain = retain + + def connect(self, clean_session=True): + self.sock = socket.socket() + addr = socket.getaddrinfo(self.server, self.port)[0][-1] + self.sock.connect(addr) + if self.ssl: + import ussl + self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) + premsg = bytearray(b"\x10\0\0\0\0\0") + msg = bytearray(b"\x04MQTT\x04\x02\0\0") + + sz = 10 + 2 + len(self.client_id) + msg[6] = clean_session << 1 + if self.user is not None: + sz += 2 + len(self.user) + 2 + len(self.pswd) + msg[6] |= 0xC0 + if self.keepalive: + assert self.keepalive < 65536 + msg[7] |= self.keepalive >> 8 + msg[8] |= self.keepalive & 0x00FF + if self.lw_topic: + sz += 2 + len(self.lw_topic) + 2 + len(self.lw_msg) + msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3 + msg[6] |= self.lw_retain << 5 + + i = 1 + while sz > 0x7f: + premsg[i] = (sz & 0x7f) | 0x80 + sz >>= 7 + i += 1 + premsg[i] = sz + + self.sock.write(premsg, i + 2) + self.sock.write(msg) + #print(hex(len(msg)), hexlify(msg, ":")) + self._send_str(self.client_id) + if self.lw_topic: + self._send_str(self.lw_topic) + self._send_str(self.lw_msg) + if self.user is not None: + self._send_str(self.user) + self._send_str(self.pswd) + resp = self.sock.read(4) + assert resp[0] == 0x20 and resp[1] == 0x02 + if resp[3] != 0: + raise MQTTException(resp[3]) + return resp[2] & 1 + + def disconnect(self): + self.sock.write(b"\xe0\0") + self.sock.close() + + def ping(self): + self.sock.write(b"\xc0\0") + + def publish(self, topic, msg, retain=False, qos=0): + pkt = bytearray(b"\x30\0\0\0") + pkt[0] |= qos << 1 | retain + sz = 2 + len(topic) + len(msg) + if qos > 0: + sz += 2 + assert sz < 2097152 + i = 1 + while sz > 0x7f: + pkt[i] = (sz & 0x7f) | 0x80 + sz >>= 7 + i += 1 + pkt[i] = sz + #print(hex(len(pkt)), hexlify(pkt, ":")) + self.sock.write(pkt, i + 1) + self._send_str(topic) + if qos > 0: + self.pid += 1 + pid = self.pid + struct.pack_into("!H", pkt, 0, pid) + self.sock.write(pkt, 2) + self.sock.write(msg) + if qos == 1: + while 1: + op = self.wait_msg() + if op == 0x40: + sz = self.sock.read(1) + assert sz == b"\x02" + rcv_pid = self.sock.read(2) + rcv_pid = rcv_pid[0] << 8 | rcv_pid[1] + if pid == rcv_pid: + return + elif qos == 2: + assert 0 + + def subscribe(self, topic, qos=0): + assert self.cb is not None, "Subscribe callback is not set" + pkt = bytearray(b"\x82\0\0\0") + self.pid += 1 + struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid) + #print(hex(len(pkt)), hexlify(pkt, ":")) + self.sock.write(pkt) + self._send_str(topic) + self.sock.write(qos.to_bytes(1, "little")) + while 1: + op = self.wait_msg() + if op == 0x90: + resp = self.sock.read(4) + #print(resp) + assert resp[1] == pkt[2] and resp[2] == pkt[3] + if resp[3] == 0x80: + raise MQTTException(resp[3]) + return + + # Wait for a single incoming MQTT message and process it. + # Subscribed messages are delivered to a callback previously + # set by .set_callback() method. Other (internal) MQTT + # messages processed internally. + def wait_msg(self): + res = self.sock.read(1) + self.sock.setblocking(True) + if res is None: + return None + if res == b"": + raise OSError(-1) + if res == b"\xd0": # PINGRESP + sz = self.sock.read(1)[0] + assert sz == 0 + return None + op = res[0] + if op & 0xf0 != 0x30: + return op + sz = self._recv_len() + topic_len = self.sock.read(2) + topic_len = (topic_len[0] << 8) | topic_len[1] + topic = self.sock.read(topic_len) + sz -= topic_len + 2 + if op & 6: + pid = self.sock.read(2) + pid = pid[0] << 8 | pid[1] + sz -= 2 + msg = self.sock.read(sz) + self.cb(topic, msg) + if op & 6 == 2: + pkt = bytearray(b"\x40\x02\0\0") + struct.pack_into("!H", pkt, 2, pid) + self.sock.write(pkt) + elif op & 6 == 4: + assert 0 + + # Checks whether a pending message from server is available. + # If not, returns immediately with None. Otherwise, does + # the same processing as wait_msg. + def check_msg(self): + self.sock.setblocking(False) + return self.wait_msg() From f2f352bed7817a6f8cbd86bc31fe39f26d1fceda Mon Sep 17 00:00:00 2001 From: "mjt@mjturner.co.uk" Date: Sun, 2 Sep 2018 23:17:14 +0100 Subject: [PATCH 05/26] Orbs Game --- orbs/main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/orbs/main.py b/orbs/main.py index 1fe5929..6ea7332 100644 --- a/orbs/main.py +++ b/orbs/main.py @@ -1,3 +1,6 @@ +""" +Orbs Game: Set your name and see the scores +""" ___name___ = "Orbs Game" ___license___ = "MIT" ___dependencies___ = ["app", "dialogs", "sim800", "ugfx_helper"] From 4ff0aa12f534804e1983c1475133bd4d23857a0d Mon Sep 17 00:00:00 2001 From: "mjt@mjturner.co.uk" Date: Sun, 2 Sep 2018 23:26:02 +0100 Subject: [PATCH 06/26] Orbs Game --- orbs/main.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/orbs/main.py b/orbs/main.py index 6ea7332..8b52d9a 100644 --- a/orbs/main.py +++ b/orbs/main.py @@ -15,10 +15,8 @@ import ugfx_helper from orbs.umqtt.simple import MQTTClient import network from machine import mem32 -wlan=network.WLAN() -if not wlan.isconnected(): - import wifi - wifi.connect() +import wifi +wifi.connect() ugfx_helper.init() ugfx.clear() From f969b16afc8c443ff7c199bd55e092c0e5f26c44 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Mon, 3 Sep 2018 23:43:00 +0100 Subject: [PATCH 07/26] Add warning prompt to mass_storage --- mass_storage/main.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/mass_storage/main.py b/mass_storage/main.py index aa88772..336ba11 100644 --- a/mass_storage/main.py +++ b/mass_storage/main.py @@ -11,12 +11,18 @@ import ugfx, tilda, ugfx_helper, dialogs, app, time ugfx_helper.init() ugfx.clear() -print("enabling USB storage...") -tilda.storage_enable_usb() -time.sleep(1) -print("DONE") -with dialogs.WaitingMessage(title="Mass Storage Enabled", text="You can now use the badge like a USB key.\nPlease safely eject afterwards. This app will close automatically."): - print("Waiting for USB mass storage to be unmounted...") - tilda.storage_disable_usb() +user_agreed = dialogs.prompt_boolean("Note: enabling mass storage is slightly risky, as the badge may end up factory " + "resetting even if you safely eject it. Do you want to continue?") + +if user_agreed: + print("enabling USB storage...") + tilda.storage_enable_usb() + time.sleep(1) print("DONE") + with dialogs.WaitingMessage(title="Mass Storage Enabled", text="You can now use the badge like a USB key.\nPlease safely eject afterwards. This app will close automatically."): + print("Waiting for USB mass storage to be unmounted...") + tilda.storage_disable_usb() + print("DONE") + app.restart_to_default() +else: app.restart_to_default() From 6e4eb3290505e148f4e2625591210b3c3ace9e6f Mon Sep 17 00:00:00 2001 From: Illlin <34010016+Illlin@users.noreply.github.com> Date: Wed, 5 Sep 2018 19:32:27 +0100 Subject: [PATCH 08/26] Added DevRant for the TiLDA-Mk4 DevRant text only client for the TiLDA-Mk4. Only supports viewing posts --- DevRant/main.py | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 DevRant/main.py diff --git a/DevRant/main.py b/DevRant/main.py new file mode 100644 index 0000000..51292ab --- /dev/null +++ b/DevRant/main.py @@ -0,0 +1,82 @@ +"""DevRant Client for TiLDA-MK4 +""" +___name___ = "DevRant" +___license___ = "MIT" +___dependencies___ = ["app", "wifi", "http", "homescreen", "utime", "ugfx_helper", "dialogs"] +___categories___ = ["Other"] +___launchable___ = True + +import ugfx, wifi, http, json, utime, ugfx_helper, dialogs, app + +char_ln = 25 +ln_pg = 19 + +def loop(): + skip = 0 + while True: + ugfx.clear(ugfx.html_color(0x544c6d)) + data= json.loads(http.get("https://devrant.com/api/devrant/rants?app=3&sort=top&range=day&limit=1&skip="+str(skip)).raise_for_status().content)["rants"][0] + + text=data["text"].split(" ") + screens = [[]] + line = "" + screen = 0 + for word in text: + if len(line+word)+1 >= char_ln: + if len(screens[screen]) >= ln_pg: + screen+=1 + screens.append([]) + screens[screen].append(line) + line=word + else: + line = line + " " + word + if len(screens[screen]) < ln_pg: + screens[screen].append(line) + else: + screens.append([line]) + + + hold=True + page = 0 + while hold: + ugfx.clear(ugfx.html_color(0x544c6d)) + ugfx.area(0,0,240,35,ugfx.html_color(0x41476d)) + ugfx.text(5,5,str(data["score"])+"++ " + data["user_username"] + ":",ugfx.BLACK) + + ugfx.text(5,20,"Page: " + str(page+1) + "/" + str(len(screens)),ugfx.BLACK) + count = 0 + for line in screens[page]: + ugfx.text(5,35+count*15,line,ugfx.BLACK) + count+=1 + hold_btn = True + while hold_btn: + if tilda.Buttons.is_pressed(tilda.Buttons.BTN_Menu): + return + if tilda.Buttons.is_pressed(tilda.Buttons.BTN_A): + skip += 1 + hold_btn = False + hold = False + while tilda.Buttons.is_pressed(tilda.Buttons.BTN_A): + utime.sleep_ms(10) + if tilda.Buttons.is_pressed(tilda.Buttons.JOY_Right): + if page < len(screens)-1: + page += 1 + hold_btn = False + while tilda.Buttons.is_pressed(tilda.Buttons.JOY_Right): + utime.sleep_ms(10) + if tilda.Buttons.is_pressed(tilda.Buttons.JOY_Left): + if page > 0: + page -= 1 + hold_btn = False + while tilda.Buttons.is_pressed(tilda.Buttons.JOY_Left): + utime.sleep_ms(10) + + +ugfx_helper.init() +ugfx.clear() +ugfx.text(5,5, "DevRant for the TiLDA Mk4", ugfx.BLACK) +ugfx.text(5, 40, "Connecting To WIFI", ugfx.BLACK) +wifi.connect() +ugfx.text(5, 40, "Connecting To WIFI", ugfx.WHITE) +loop() +app.restart_to_default() From 24c8935cd03bb25657f52660bc968a89b6e6deb6 Mon Sep 17 00:00:00 2001 From: Illlin <34010016+Illlin@users.noreply.github.com> Date: Wed, 5 Sep 2018 19:41:57 +0100 Subject: [PATCH 09/26] Fixed dependency error --- DevRant/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DevRant/main.py b/DevRant/main.py index 51292ab..f029ab8 100644 --- a/DevRant/main.py +++ b/DevRant/main.py @@ -2,7 +2,7 @@ """ ___name___ = "DevRant" ___license___ = "MIT" -___dependencies___ = ["app", "wifi", "http", "homescreen", "utime", "ugfx_helper", "dialogs"] +___dependencies___ = ["app", "wifi", "http", "homescreen", "ugfx_helper", "dialogs"] ___categories___ = ["Other"] ___launchable___ = True From e941220c41c8d421578206029501dd487190f166 Mon Sep 17 00:00:00 2001 From: Illlin <34010016+Illlin@users.noreply.github.com> Date: Wed, 5 Sep 2018 19:49:39 +0100 Subject: [PATCH 10/26] Done more dependency changeing --- DevRant/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DevRant/main.py b/DevRant/main.py index f029ab8..00920aa 100644 --- a/DevRant/main.py +++ b/DevRant/main.py @@ -2,7 +2,7 @@ """ ___name___ = "DevRant" ___license___ = "MIT" -___dependencies___ = ["app", "wifi", "http", "homescreen", "ugfx_helper", "dialogs"] +___dependencies___ = ["app", "wifi", "http", "ugfx_helper"] ___categories___ = ["Other"] ___launchable___ = True From 29cf7896dcaf1c51914c1d732a9d6b08836ed6b0 Mon Sep 17 00:00:00 2001 From: mallyhubz Date: Thu, 6 Sep 2018 00:22:41 +0100 Subject: [PATCH 11/26] nyan cat homescreen --- cmd.exe.lnk | Bin 0 -> 1244 bytes nyan_home/frame_0_delay-0.07s.gif | Bin 0 -> 4341 bytes nyan_home/frame_10_delay-0.07s.gif | Bin 0 -> 4383 bytes nyan_home/frame_11_delay-0.07s.gif | Bin 0 -> 4265 bytes nyan_home/frame_1_delay-0.07s.gif | Bin 0 -> 4088 bytes nyan_home/frame_2_delay-0.07s.gif | Bin 0 -> 4321 bytes nyan_home/frame_3_delay-0.07s.gif | Bin 0 -> 4272 bytes nyan_home/frame_4_delay-0.07s.gif | Bin 0 -> 4242 bytes nyan_home/frame_5_delay-0.07s.gif | Bin 0 -> 4458 bytes nyan_home/frame_6_delay-0.07s.gif | Bin 0 -> 4464 bytes nyan_home/frame_7_delay-0.07s.gif | Bin 0 -> 4500 bytes nyan_home/frame_8_delay-0.07s.gif | Bin 0 -> 4467 bytes nyan_home/frame_9_delay-0.07s.gif | Bin 0 -> 4857 bytes nyan_home/main.py | 104 +++++++++++++++++++++++++++++ tilda_tools.bat | 2 + 15 files changed, 106 insertions(+) create mode 100644 cmd.exe.lnk create mode 100644 nyan_home/frame_0_delay-0.07s.gif create mode 100644 nyan_home/frame_10_delay-0.07s.gif create mode 100644 nyan_home/frame_11_delay-0.07s.gif create mode 100644 nyan_home/frame_1_delay-0.07s.gif create mode 100644 nyan_home/frame_2_delay-0.07s.gif create mode 100644 nyan_home/frame_3_delay-0.07s.gif create mode 100644 nyan_home/frame_4_delay-0.07s.gif create mode 100644 nyan_home/frame_5_delay-0.07s.gif create mode 100644 nyan_home/frame_6_delay-0.07s.gif create mode 100644 nyan_home/frame_7_delay-0.07s.gif create mode 100644 nyan_home/frame_8_delay-0.07s.gif create mode 100644 nyan_home/frame_9_delay-0.07s.gif create mode 100644 nyan_home/main.py create mode 100644 tilda_tools.bat diff --git a/cmd.exe.lnk b/cmd.exe.lnk new file mode 100644 index 0000000000000000000000000000000000000000..e92d25531ab9d5e78e8d3e0fc585195c7c308948 GIT binary patch literal 1244 zcmah}ZAg<*6h1S9`9W=HVp6#xrxCqve$*5MbAHU)rZMs(CMesYmG35Qq5e_`0zdi@ z5?E14&g@4;i%KXJgZ>s;6e)#eL6L|UL_z)NId^XJBk*3HbMAZ2xzD}#+;d+u5h;>m zAc-b~q_RFzk_O}Y$75F(rd})7YLa3_q#_g_k$H+_O0W7@IjQ+x;8xvyr=Dx79~Q6i2bNINoEvbelaAVgi|Qkg3tBVpR9Dg=)x6 z9&(bGTFD1%3Y}bL-D@!gRb*@T`CW2OHc{~kUiL9>u{s`dpJ0m$Z~QFTs2zNMa*<3q zgy~qlnl+BzV>XRy$RRr=SDS0aeodq7Vcy|$iI8eRsf=W4@QqgC0H2d2@U{WGU!tSH z4uAt$9{{*j0L-xoxNxF9O$ALz<#ML%;j`JpTOlo3sDSKL3S9YklC7W}4uk_rE(`w1KQ^{7zPz(5_s^|mV8f^KZaNL}T_ zzbBIdzEgV&VR!OU=>R8n?FDKmi;N;Ut4k()`CXX9#B<%XWus<;@#){BK5f7JQifer zI}`KW+K@#(kOyRoQ8pb$jTq1mLFb|8!JP5yAK6B(u z>o_2Gy1;#GwvZGje);lBWXbLsLXZ=G>u6<&U&e)N_mDyLH?D`4Nn0h}$a zm;a^QzV34D>kh*l`2a5xOp#0OUTiiEn~J1BVO#G`*iUnS37EH*cKo^aS$)2<)8qBH HR~6kqg>e0$ literal 0 HcmV?d00001 diff --git a/nyan_home/frame_0_delay-0.07s.gif b/nyan_home/frame_0_delay-0.07s.gif new file mode 100644 index 0000000000000000000000000000000000000000..3cd1b49db829a62cd595e7f00bec26b1ffb0451f GIT binary patch literal 4341 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 literal 0 HcmV?d00001 diff --git a/nyan_home/frame_10_delay-0.07s.gif b/nyan_home/frame_10_delay-0.07s.gif new file mode 100644 index 0000000000000000000000000000000000000000..9bd6bb76cdf532a8b693cf9c4669948b1ff23677 GIT binary patch literal 4383 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 ZC!E4BTqM{~!842m=g|l2F%Lli06V2gKE?n5 literal 0 HcmV?d00001 diff --git a/nyan_home/frame_11_delay-0.07s.gif b/nyan_home/frame_11_delay-0.07s.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ae2a33c0b9245393ca4a519871673bf53c44483 GIT binary patch literal 4265 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 LSh4#LK>z?dw^$hW literal 0 HcmV?d00001 diff --git a/nyan_home/frame_1_delay-0.07s.gif b/nyan_home/frame_1_delay-0.07s.gif new file mode 100644 index 0000000000000000000000000000000000000000..c241da5a81c38a9ef6a9ad6fbcc8b9529d8818d4 GIT binary patch literal 4088 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 P4*b9d5FEiw5d;7`UNS_& literal 0 HcmV?d00001 diff --git a/nyan_home/frame_3_delay-0.07s.gif b/nyan_home/frame_3_delay-0.07s.gif new file mode 100644 index 0000000000000000000000000000000000000000..5671518d1e6492d6dbf95d48af625605f42eaa3c GIT binary patch literal 4272 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 literal 0 HcmV?d00001 diff --git a/nyan_home/frame_5_delay-0.07s.gif b/nyan_home/frame_5_delay-0.07s.gif new file mode 100644 index 0000000000000000000000000000000000000000..be68cdda94ad26776cfda860fc530d47cfe5825b GIT binary patch literal 4458 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 C=#5kW literal 0 HcmV?d00001 diff --git a/nyan_home/frame_7_delay-0.07s.gif b/nyan_home/frame_7_delay-0.07s.gif new file mode 100644 index 0000000000000000000000000000000000000000..7674493a29f58915552306a3d4873ad44efd4a4e GIT binary patch literal 4500 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 literal 0 HcmV?d00001 diff --git a/nyan_home/frame_8_delay-0.07s.gif b/nyan_home/frame_8_delay-0.07s.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef75ebf964337398f09ad0742582355cb1ab01c6 GIT binary patch literal 4467 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 F06SlPrMUnA literal 0 HcmV?d00001 diff --git a/nyan_home/frame_9_delay-0.07s.gif b/nyan_home/frame_9_delay-0.07s.gif new file mode 100644 index 0000000000000000000000000000000000000000..71aa5a0ad3dd852952f6a500c5598587e2e26ab5 GIT binary patch literal 4857 zcmd6qr0R@nwCA3`-*fYlCg;}0mej++$=ut)%_1Ynf|N3+23EWly`{cmvw zx3X{i{rSe$nF8@u0cXV z3W-E2A-^szt2rQ%7HH8Y{h92KS?r$thNkx4gk=_q#V%PG92%SXHn+6AdUC=7{(nd1 zfAjw50yxFS^Mr>nH+9iOn+0EA1zgi2`(g9#|v_fX$#%;9Zem|{z zitfYy(U)URub64V?X1l7(<^7+<00Hq7USnaJEFJ~FZ;+6oMhz-mA-`|3081Dg$EuC zlJ!DANz`YfY~mxhlbiG9bHc=r<&I)=jeA?@(DhSQd`QrGRmhX6YGEzgsaeWV!|T!r|NH&m8gc@i&_IH@=-YO*cK!&D|bqDm;JnNXP41 zYw$3}@4{X#>xl4&fy=va8R-hS_LTwVl<2x4_f<<|2F$;N>fq5QYQmogIqHT4rxuTe zSsFEi0XmXBB+Pr}MTUW+o3x3x_ck@q}m<;k$$ z6xmc~N9d!JEBN}qaMyU%-KbKya#cN)2;pX9! z^Wrw6roAD$yu0C6S~n&Jc`AldIO`z4bfd(qOzd$|rO@Tok_Myd)qD*-1{x|P_;{_V zN4|8e8WAlYQzgh?cGMc#qT8y+)$AAmn1{JeXGSV-)X!%;-e_1*LYNzWxyjsU+Uio? zY~H!Y04j(}V`?qOd&=G*017Y|P+`xlHkd-$Ry&V!5TlW2ZFRHrWHPprEq^3!{;P`v zibMm*D3$FV*-X#vUd6(o?T%`b=3o7rlLj&UDBtO=LEWEa8tstg22)!17nR?2XyGTn zN3?{|Xpn`@`tMO|jOy;#KX)v(Kn2M1-7oh3gWla>*cJrgocUyL!mY4;Z_<-Kqs;}t z0HB|Od-7)nXEXhaaS=MVH;X@|wm)%+aq{=foB8tn?*Whj`fM0R?O;AaVA@wP&b31C zlbP}iee!a++Tqf>Os~V`qC%s_$#ji)twnOTT41wKr{v!F6Yd+G8_j<`^AOJ;8p+@I?;5syTh_=yr$NOZrO?>$I!oSM1gdL`4Xx;0rj zc*5xS=4TxTB(iZEt3NB*8(!}>FYE}EGC0)mAz-mBJj{Xu7O)K&SKSIhbfTv>qG%sQ z9|jvELpil{n@=w$`nm5sIM$r2`U)rd%PQ?B@f=xdTG<*_1hAdwCcLut=hn0#w9D}kjQj%6u5ayO6q zb29~mEeH$;ne@tAUV(W!159^msz_+bz1Pdmu#~Ld1X;yPa0~R;#>w3Z+@P`pCdsPhaJLePUNq~TY~#M~29CD$bUbYk1{e9K z9PL&D=JmmY6wy^gN#M~Ltd(LU1*!lmcf*)Ze#+Xbm5+ATvg)7w!kO{rKXPjbxI9Q| zjY+GY0iA(i^;T#6!u2@-kRRD@W`%-{76^B}G&Q-XuTxw6p%DK1X!`3->!NB^Febnt zWtU z)+$b!eOOJ8jA{tOGd%e*3^BFer91S?&3M|%wGYXO9#Xtv>B*d)q+wO|-n98)r=)8# zyCO!a(h4mW5Zppd2YJOwuF7-)g98Rw{Je9zJxVg@pm(GEY5Laz7l|Da#^9KY2z?qO z{pNrH5vZ~3pK6hNbGO~s#+Q7`a%sikfczi`loO(ZJ#Wwu_<}WKd2;*+{hmHT9P)FY zHMDi@6XlFmdz!g9;2=p9t0}ssf`eSc+K>;2GK6XiTrJ(MJCUgI^3S}U$y4E)q_L_5 z_42407rWH`+~;4kUU#s&)?73Uur0T>vlLVwJKEWGcNuAK{;Rrf^kd*-aHRU#3QI4~ zzwS+mThc1vNB~@aG_#eU6Ou2v_Vi*VL~0-3`e$(S)zQ)H$p*UM;s^*YF2NMX?gkrJ z8j7y{O}Q{nt5vw}{q#&|qbL*4sXg>7A@KMIlD*Hka{b>F1$!*_`(0Z1z9qrtcwz2( z4K;@x!aIJvs5{&+Lz%+cmzgL^gc7!LyDYZf?*z(>PYR;cF3$ zhS&@rj@UT(WgHP{=4T8>Rb63ch$m}q7=u&QL(gCTb-eEL(|^jlHKcKBW~15oAo>k_ zUIab;Mtu5T<|8z~h9Q7y#|MqPNCvL!Jo8soFMeLZ>c7aB8$^0Qug>s6f~(Qo>8U_N zft)WPLS;09RZB`44vo`Y#HYQ9Zy^Kd2jiquXOkCz#hZ=$k*P zb@6^#p$}d7Dp?Q${ttfP&!dbv{?Y;m)SnPlzEEzFpwKP6l5UWAlE1XT%Wn}c?Yj+T z-i2&;hU`3NyU5z&;WR%3w@}W#SLbw}NgxAq{KJv-P^l>?%2O>SAfZfUe9nOI6p>*?`dYjTwqiGVr!$r$9tYi`amk8WA7_IY3}i9 zC9(+&*pst6@eeqIP|d($UC)`OH`b*a;nVNlwfCDy4@G1I!P6ccWa8b^ZtNyBd`Qz7&G`BQ<6~+F)njMc zxo7$l>;m*IIZR{*i4uu=8Lp;8^9BuW;iulkZcisdR1S#wL|fyGvjRSm8~%~e>2|5b zse$gKha?j1TpF2_ak~eo#-)J*FnK?MUjFoNoWGP85RvbmZgv;-1_oHUVY%UCyW&h9 zG`TK-Jno(mR!j~ffvbt&um+z@D4zTqGbD&d5wmrQ(_X?Nrf)ej<#hZ+$k$zSu%w** z3G$Sl)67B6oI3{1xU%8=dT@-mvYfJ39I^WO#j346Gu`2nd-|CB8%NR`p~;w5QJv#+ zsBfaN%wiiriSqWqUq0Z4<#UQEiIUxr!efR_>Pkw#5PHSRfv0qnQBlK?>B<3Kzt zQUvqGJ7JzgFjIT(B~~hx z4onu*HWt88KnfVB7b|YOXXFJb`6UYhSr=vz?bd|Y-rw~r=9S{6Nrsyd1uKmeYcU0b zhZS35mD^l}Une!80EJPke^{dL0@2yfE=h*xJTI{h-zwq^q{3D!b{eTXQ&jI4<$XVk zQ#GnoBmbQhqZ*93-i&~)Pgbq0P?6%*+kM5z9nXEUs^pFflF?Noy&mF$FsaolX@eR~ zaw&XN=TcIQep8L%RE^P54Z5@@a`f@}zG_@XQ7ocH(yqqBu10CAR+R$gVB{n4;EO(W zw&c2dO?CEDbq?gZD^niJIy7fHnoA(fsT7#qc8H+Vu20tba90O$#UwR&w7;O^$n?_? zxL1G0(<3^!c{LDdccz3M8Cb92t8t#pu6=n_g+Hp_RH|>eQ_t;G!Xp4IctjA7ye!=s z415!~I_UAG)Fit`ve+%yxls0KVk)VILL1K1yQJiYIQ*>o2*lMb&^{9y< z-rUAr-)`5;h;0nx&J&>BJw=U^c27Fr)tqh&82Y@Dse)wX(*&r3}vA9#x?SuccnTU!2m-* z4sKQ=Aq;qsRP8Sr)sJilue~!rj{<0vQva-NrL;+0f=lX{e%1mmHxT$-w16YE9jd`t zy~R+A15nuvQ)Kyn4~*)~4&LleoIFY(n_#-ukxFfHw(oM0=%g^)x|+H?r<;U3U>Frt z1;GP>XgSB@^n>gXQEFYwC-mD^Dx&8Ith_bI*Wis}HfFOD4lSzf}w!X_mJ^#VW((g8DhG^zQ-vTzLb611O>=O#gBp=ZH+%0P4d4Fp!Pv zvp+Kx=YSdt()ef(8#R=P^cmz%9h?n9%~+gSvg;+;_pWD48uQC;@(f4$3?Gt(7bFy0 za;4&=Wmw0<^AaPi$6e4C#TJV}Sk6e 11: + i = 0 + + if bkl: + force_backlight() + continue + + if ext: + break + +machine.reset() \ No newline at end of file diff --git a/tilda_tools.bat b/tilda_tools.bat new file mode 100644 index 0000000..0d0e351 --- /dev/null +++ b/tilda_tools.bat @@ -0,0 +1,2 @@ +@echo off +python %CD%/.development\tilda_tools.py %* \ No newline at end of file From 15314555429f874ebcfc23291d9f69216c920870 Mon Sep 17 00:00:00 2001 From: mallyhubz Date: Thu, 6 Sep 2018 00:34:43 +0100 Subject: [PATCH 12/26] fixed dependency metadata --- .gitignore | 2 ++ nyan_home/main.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7613256..7505e99 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ __pycache__ wifi*.json config.json +cmd.exe.lnk +tilda_tools.bat \ No newline at end of file diff --git a/nyan_home/main.py b/nyan_home/main.py index 8da6574..04e808f 100644 --- a/nyan_home/main.py +++ b/nyan_home/main.py @@ -2,7 +2,7 @@ """ ___name___ = "Nyan" ___license___ = "MIT" -___dependencies___ = ["app", "homescreen", "ugfx_helper", "machine"] +___dependencies___ = ["app", "homescreen", "ugfx_helper"] ___categories___ = ["Homescreens"] ___bootstrapped___ = False From e9415827b7ecb28de3daf319fb5ad5acdf4fcaac Mon Sep 17 00:00:00 2001 From: mallyhubz Date: Thu, 6 Sep 2018 01:00:33 +0100 Subject: [PATCH 13/26] fixed menu long press --- cmd.exe.lnk | Bin 1244 -> 1288 bytes nyan_home/main.py | 28 ++-------------------------- tilda_tools.bat | 2 +- 3 files changed, 3 insertions(+), 27 deletions(-) diff --git a/cmd.exe.lnk b/cmd.exe.lnk index e92d25531ab9d5e78e8d3e0fc585195c7c308948..277074e49b1870c03e08bb74c2c8b11de9b7f2a2 100644 GIT binary patch delta 93 zcmcb^*}*kIgmLyp(H)F}iVS){7=s`uC$SitN-;PySOG;t8HyQF8H#{p3_~tMB0~;? i0z(EvDMJ!N6;Q;NA)CR3L6^aip#TVrH%l=cVgdk!I1;7+ delta 95 zcmeC+y2Cj^gmLml(H)GwY7D*%Rtzx=u0YxiNc%EmGng>wGB`360AVqZmCKL_q)Ql5 O8HxzWZ+2rk!~_7rdJ~`k diff --git a/nyan_home/main.py b/nyan_home/main.py index 04e808f..f52d216 100644 --- a/nyan_home/main.py +++ b/nyan_home/main.py @@ -44,25 +44,7 @@ ugfx.clear() ugfx.orientation(180) force_backlight() -Buttons.enable_interrupt( - Buttons.BTN_A, - cbButtonA, - on_press=True, - on_release=False); -Buttons.enable_interrupt( - Buttons.BTN_B, - cbButtonB, - on_press=True, - on_release=False); - -def cbButtonA(button_id): - global bkl - bkl = True - -def cbButtonB(button_id): - global ext - ext = False #everything from here onwards is unknown # Colour stuff @@ -93,12 +75,6 @@ while True: i = i + 1 if i > 11: i = 0 + sleep_or_exit(0.5) - if bkl: - force_backlight() - continue - - if ext: - break - -machine.reset() \ No newline at end of file +app.restart_to_default() \ No newline at end of file diff --git a/tilda_tools.bat b/tilda_tools.bat index 0d0e351..76c731f 100644 --- a/tilda_tools.bat +++ b/tilda_tools.bat @@ -1,2 +1,2 @@ @echo off -python %CD%/.development\tilda_tools.py %* \ No newline at end of file +python "%CD%/.development\tilda_tools.py" %* \ No newline at end of file From bc0fa1f8cb8b638e2d83081b9a435eae641dd8b4 Mon Sep 17 00:00:00 2001 From: Filip Wieland Date: Sun, 9 Sep 2018 13:14:30 +0100 Subject: [PATCH 14/26] Trains - Initial commit --- trains/main.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 trains/main.py diff --git a/trains/main.py b/trains/main.py new file mode 100644 index 0000000..5685313 --- /dev/null +++ b/trains/main.py @@ -0,0 +1,56 @@ +"""Mini train departure board for your badge + +Configurable with which station you want to monitor +""" +___title___ = "trains" +___license___ = "MIT" +___dependencies___ = ["app", "sleep", "wifi", "http", "ugfx_helper"] +___categories___ = ["Homescreens", "Other"] + +# Config + +STATION_CODE = "DEP" +API_URL = "https://huxley.apphb.com/all/{}?expand=true&accessToken=D102521A-06C6-44C9-8693-7A0394C757EF" + +import wifi +import ugfx +import http +import ujson +import app +import sleep +from tilda import Buttons, LED + + +# initialize screen +ugfx.init() +ugfx.clear() + +# initial screen +ugfx.text(5, 5, "Will monitor station:", ugfx.BLACK) +ugfx.text(200, 5, STATION_CODE, ugfx.BLUE) + +def get_trains(): + global station_data + + LED(LED.RED).on() # Red for total get_trains + try: + station_json = http.get(API_URL.format(STATION_CODE)).raise_for_status().content + LED(LED.GREEN).on() # Green for parsing + station_data = ujson.loads(station_json) + except: + print('oh poop') + + LED(LED.RED).off() + LED(LED.GREEN).off() + +get_trains() +ugfx.text(5, 20, station_data['locationName'], ugfx.RED) + +# waiting until a button has been pressed +while (not Buttons.is_pressed(Buttons.BTN_A)) and (not Buttons.is_pressed(Buttons.BTN_B)) and (not Buttons.is_pressed(Buttons.BTN_Menu)): + sleep.wfi() + + +# closing +ugfx.clear() +app.restart_to_default() From 1ee0067f231ec4ac3fb2fef5b64dbf897a835884 Mon Sep 17 00:00:00 2001 From: Dave Arter Date: Mon, 10 Sep 2018 14:11:46 +0100 Subject: [PATCH 15/26] Call /update instead of /install on the backend when updating apps The badge has no way of knowing whether an installed app came from the badge store or local development, so simply requests all installed apps when doing an update. The default /install path on the backend will return a 404 if any of the requested apps aren't in the repo. This commit calls /update instead, which doesn't 404 if an app is missing. Depends on emfcamp/Mk4-Backend#2 Fixes #57 --- badge_store/main.py | 2 +- lib/badge_store.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/badge_store/main.py b/badge_store/main.py index 8a16d80..5b53447 100644 --- a/badge_store/main.py +++ b/badge_store/main.py @@ -74,7 +74,7 @@ def show_update(): if update: clear() with WaitingMessage(title=title, text="Please wait...") as message: - installers = store.install(_get_current_apps()) + installers = store.update(_get_current_apps()) n = len(installers) for i, installer in enumerate(installers): message.text = "%s (%s/%s)" % (installer.path, i + 1, n) diff --git a/lib/badge_store.py b/lib/badge_store.py index 4be17c6..2eaa026 100644 --- a/lib/badge_store.py +++ b/lib/badge_store.py @@ -34,6 +34,9 @@ class BadgeStore: def install(self, apps): return self._create_installers(self._call("install", {"apps": ",".join(apps)})) + def update(self, apps): + return self._create_installers(self._call("update", {"apps": ",".join(apps)})) + def bootstrap(self): return self._create_installers(self._call("bootstrap")) From 1a4b656270dd65306948a236e7b4808603db53f5 Mon Sep 17 00:00:00 2001 From: Emily Date: Tue, 11 Sep 2018 18:22:32 +0100 Subject: [PATCH 16/26] + Added function to exit app --- holland/main.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/holland/main.py b/holland/main.py index 1fcfacb..a2efdce 100644 --- a/holland/main.py +++ b/holland/main.py @@ -98,6 +98,9 @@ freq = { "B": 4938, "C2": 5322, } + +def cbButtonMenu(button_id): + restart_to_default() def cbButtonCall(button_id): sim800.speakervolume(100) @@ -155,6 +158,12 @@ def cbButtonHash(button_id): global vip vip = False ugfx.display_image(0, 0, "holland/brenno.png") + +Buttons.enable_interrupt( + Buttons.BTN_Menu, + cbButtonMenu, + on_press=True, + on_release=False); Buttons.enable_interrupt( Buttons.BTN_Call, From edb57cbe3bb05125e29f6bbd0535982c82222cb6 Mon Sep 17 00:00:00 2001 From: Thomas Lake Date: Sun, 9 Sep 2018 16:05:17 +0100 Subject: [PATCH 17/26] Allow default launcher selection This allows e.g. speedlauncher to be used with any of the homescreen apps --- launcher/main.py | 2 +- lib/homescreen.py | 8 +++++++- settings/main.py | 7 +++++++ speedlauncher/main.py | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/launcher/main.py b/launcher/main.py index a5fe98e..d2498a1 100644 --- a/launcher/main.py +++ b/launcher/main.py @@ -2,7 +2,7 @@ ___title___ = "Launcher" ___license___ = "MIT" -___categories___ = ["System"] +___categories___ = ["System", "Launcher"] ___dependencies___ = ["dialogs", "app", "ugfx_helper"] ___launchable___ = False ___bootstrapped___ = True diff --git a/lib/homescreen.py b/lib/homescreen.py index 5afa460..19bf903 100644 --- a/lib/homescreen.py +++ b/lib/homescreen.py @@ -51,7 +51,13 @@ def sleep_or_exit(interval = 0.5): # todo: do this better - check button multiple times and sleep for only a short while if buttons.is_triggered(tilda.Buttons.BTN_Menu): clean_up() - App("launcher").boot() + launcher = "launcher" + try: + with open("default_launcher.txt", "r") as dl: + launcher=dl.readline() + except OSError: + pass + App(launcher).boot() sleep.sleep(interval) diff --git a/settings/main.py b/settings/main.py index ab344e2..f0bcdfe 100644 --- a/settings/main.py +++ b/settings/main.py @@ -33,12 +33,19 @@ def settings_startup_app(state): def settings_wifi(state): wifi.choose_wifi() +def settings_launcher(state): + apps = app.get_apps("Launcher") + selection = prompt_option([{"title": a.title, "app": a} for a in apps], text="Select App:", none_text="Back", title="Set default launcher") + if selection: + app.write_launch_file(selection["app"].name, "default_launcher.txt") + def settings_main(state): return selection({ "Homescreen Name": change_database_string("Set your name", "homescreen.name"), "Homescreen Callsign": change_database_string("Set your callsign", "homescreen.callsign"), "Wifi": settings_wifi, "Startup app": settings_startup_app, + "Default Launcher": settings_launcher, "Badge Store": settings_badge_store }, none_text="Exit") diff --git a/speedlauncher/main.py b/speedlauncher/main.py index f56174c..a78725d 100644 --- a/speedlauncher/main.py +++ b/speedlauncher/main.py @@ -2,7 +2,7 @@ ___name___ = "Speed Launcher" ___license___ = "WTFPL" -___categories___ = ["System"] +___categories___ = ["System", "Launcher"] ___dependencies___ = ["app", "ugfx_helper"] ___launchable___ = False ___bootstrapped___ = False From fade33fd3d90e551a57ef74519852fa8095f35cb Mon Sep 17 00:00:00 2001 From: Molive Date: Wed, 12 Sep 2018 22:17:02 +0100 Subject: [PATCH 18/26] Add Arp music synth --- soundsarecool/main.py | 97 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 soundsarecool/main.py diff --git a/soundsarecool/main.py b/soundsarecool/main.py new file mode 100644 index 0000000..fea225a --- /dev/null +++ b/soundsarecool/main.py @@ -0,0 +1,97 @@ +''' +A small N channel music player a la 8088 MPH +(Demo is only two channels) + +By Molive^SLP +''' + +___name___ = "Arp Music Player" +___title___ = "Arp Music Player" +___license___ = "WTFPL" +___dependencies___ = ["ugfx_helper", "speaker"] +___categories___ = ["Demo","Sound"] + +import speaker +import utime + +from app import restart_to_default +from tilda import Buttons + +channels = [ #Supports up to n simultaneous channels. + #Each channel will loop it's data independently from the others + [ #and channels do not need the same length of data in them. + ('F4',2), #No. of channels is decided on startup, and all channels are running at any one time. + ('D#4',2), + ('D4',2), + ('C#4',1), + ('D#4',1), + ], + + ##[ + ##('A#3',4), + ##], + + ##[ + ##('C4',4), + ##], + + [ + ('F5',0.125), + ('G#5',0.25), + ('F5',0.125), + ('A#5',0.25), + ('F5',0.125), + ('C6',0.25), + ('F5',0.125), + ('A#5',0.25), + ('F5',0.25), + ('G#5',0.25), + ], + + ] + +def prt(s): + ugfx.clear() + ugfx.text(5,5,str(s),0) + +import ugfx +ugfx.init() + +prt("RUNNING SOUND TEST") + +utime.sleep(1) + +prt("Use menu to reboot") + +speaker.enabled(True) + +channel_waits = [ #Add more of these to increase the max channel count + [-1,utime.ticks_ms()], + [-1,utime.ticks_ms()], + [-1,utime.ticks_ms()], + [-1,utime.ticks_ms()], + ] + +current_channel = 0 + +while True: #Main awesome loop which handles all music channels. Can handle and arbitrary amount, but lags at high numbers. + for channel in channels: + ##print(channel_waits[current_channel][1]) #Uncomment some of these for more debug info :P + if channel_waits[current_channel][1] == 0 or channel_waits[current_channel][1] <= utime.ticks_ms(): + print("CHANGING CHANNEL "+str(current_channel)) + channel_waits[current_channel][0] += 1 + if channel_waits[current_channel][0] == len(channel): + channel_waits[current_channel][0] = 0 + channel_waits[current_channel][1] += (channels[current_channel][channel_waits[current_channel][0]][1]*1000.0) + speaker.note(channel[channel_waits[current_channel][0]][0]) + ##print(channel[channel_waits[current_channel][0]]) + if Buttons.is_pressed(Buttons.BTN_Menu): + print("BAIL BAIL BAIL") + restart_to_default() + current_channel += 1 + if current_channel == len(channels): + current_channel = 0 + ##print(current_channel) + utime.sleep(0.03) #Decrease this for more accurate but weirder arps. Comment it out for insane madness + +restart_to_default() \ No newline at end of file From f160547e7d40f64a608d400276f2b49ed3b1688d Mon Sep 17 00:00:00 2001 From: Filip Wieland Date: Wed, 12 Sep 2018 22:26:48 +0100 Subject: [PATCH 19/26] Departure board for Deptford --- trains/main.py | 86 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 15 deletions(-) diff --git a/trains/main.py b/trains/main.py index 5685313..d5a0ffc 100644 --- a/trains/main.py +++ b/trains/main.py @@ -20,17 +20,23 @@ import app import sleep from tilda import Buttons, LED - -# initialize screen -ugfx.init() -ugfx.clear() - -# initial screen -ugfx.text(5, 5, "Will monitor station:", ugfx.BLACK) -ugfx.text(200, 5, STATION_CODE, ugfx.BLUE) - +def init(): + # initialize screen + ugfx.init() + ugfx.clear() + ugfx.orientation(90) + ugfx.backlight(50) + + # ensure wifi connection + if not wifi.is_connected(): + wifi.connect(show_wait_message=True) + + # show initial screen + ugfx.text(5, 5, "Will monitor station:", ugfx.BLACK) + ugfx.text(200, 5, STATION_CODE, ugfx.BLUE) + def get_trains(): - global station_data + station_data = None LED(LED.RED).on() # Red for total get_trains try: @@ -38,17 +44,67 @@ def get_trains(): LED(LED.GREEN).on() # Green for parsing station_data = ujson.loads(station_json) except: - print('oh poop') + print('Fuck') LED(LED.RED).off() LED(LED.GREEN).off() + return station_data -get_trains() -ugfx.text(5, 20, station_data['locationName'], ugfx.RED) +def get_time(station_data): + return ':'.join(station_data['generatedAt'].split('T')[1].split(':')[0:2]) -# waiting until a button has been pressed +def is_red(service): + return service['isCancelled'] or service['etd'] != 'On time' + +def get_arrival(service): + if service['isCancelled']: + return 'CANX' + + if service['eta'] == 'On time': + return service['sta'] + + return service['eta'] + +def get_title(name, has_error): + if has_error: + return 'ERR ' + name + + return name + +def show_trains(station_data, has_error): + ugfx.clear() + ugfx.area(0, 0, 240, 25, + ugfx.RED if has_error else ugfx.GRAY) + title = get_title(station_data['locationName'], has_error) + ugfx.text(5, 5, title, + ugfx.WHITE if has_error else ugfx.BLACK) + ugfx.text(195, 5, get_time(station_data), ugfx.BLUE) + names = ugfx.Container(0, 25, 190, 295) + names.show() + for idx, service in enumerate(station_data['trainServices']): + names.text(5, 15 * idx, service['destination'][0]['locationName'], ugfx.BLACK) + ugfx.text(195, 25 + (15 * idx), get_arrival(service), ugfx.RED if is_red(service) else ugfx.BLUE) + +def show_error(): + ugfx.clear() + ugfx.text(5, 5, 'Error :(', ugfx.RED) + +init() +station_data = None +has_error = False while (not Buttons.is_pressed(Buttons.BTN_A)) and (not Buttons.is_pressed(Buttons.BTN_B)) and (not Buttons.is_pressed(Buttons.BTN_Menu)): - sleep.wfi() + new_station_data = get_trains() + if new_station_data == None: + has_error = True + else: + station_data = new_station_data + has_error = False + + if station_data == None: + show_error() + else: + show_trains(station_data, has_error) + sleep.sleep_ms(30 * 1000) # closing From 4a6271de0731a163e143bbefdb51f94323fee152 Mon Sep 17 00:00:00 2001 From: Kimball Johnson Date: Sat, 15 Sep 2018 09:53:09 +0100 Subject: [PATCH 20/26] Add homescreen for PyCon --- home_pycon/main.py | 93 +++++++++++++++++++++++++++++++++++ home_pycon/python_single.png | Bin 0 -> 963 bytes 2 files changed, 93 insertions(+) create mode 100644 home_pycon/main.py create mode 100644 home_pycon/python_single.png diff --git a/home_pycon/main.py b/home_pycon/main.py new file mode 100644 index 0000000..bad3158 --- /dev/null +++ b/home_pycon/main.py @@ -0,0 +1,93 @@ +"""Default homescreen + +This is the default homescreen for the Tilda Mk4. +It gets automatically installed when a badge is +newly activated or reset. +""" + +___title___ = "Homescreen (PyCon)" +___license___ = "MIT" +___categories___ = ["Homescreens"] +___dependencies___ = ["homescreen"] +___launchable___ = False +___bootstrapped___ = True + +import ugfx +from homescreen import * +import time +from tilda import Buttons + +init() + +# Padding for name +intro_height = 30 +intro_text = "Hi! I'm" +name_height = 60 +status_height = 20 +info_height = 30 +logo_path = "home_pycon/python_single.png" +logo_height = 82 +logo_width = 55 + +# Maximum length of name before downscaling +max_name = 8 + +# Background stuff +bg_color = 0xfecb2f +ugfx.clear(ugfx.html_color(bg_color)) + +# Colour stuff +style = ugfx.Style() +style.set_enabled([ugfx.BLACK, ugfx.html_color(bg_color), ugfx.html_color(bg_color), ugfx.html_color(bg_color)]) +style.set_background(ugfx.html_color(bg_color)) +ugfx.set_default_style(style) + +# Draw for people to see +ugfx.orientation(90) + +# Logo stuff +ugfx.display_image( + int((ugfx.width() - logo_width) / 2), + int((ugfx.height() - logo_height) / 2), + logo_path +) + + + + +# Draw introduction +ugfx.set_default_font(ugfx.FONT_TITLE) +ugfx.Label(0, ugfx.height() - name_height - intro_height, ugfx.width(), intro_height, intro_text, justification=ugfx.Label.CENTER) +# Process name +name_setting = name("Set your name in the settings app") +if len(name_setting) <= max_name: + ugfx.set_default_font(ugfx.FONT_NAME) +else: + ugfx.set_default_font(ugfx.FONT_MEDIUM_BOLD) +# Draw name +ugfx.Label(0, ugfx.height() - name_height, ugfx.width(), name_height, name_setting, justification=ugfx.Label.CENTER) + + + +# Draw for wearer to see +ugfx.orientation(270) +# Title +ugfx.set_default_font(ugfx.FONT_TITLE) +ugfx.Label(0, ugfx.height() - info_height * 2, ugfx.width(), info_height, "TiLDA Mk4", justification=ugfx.Label.CENTER) +# info +ugfx.Label(0, ugfx.height() - info_height, ugfx.width(), info_height, "Long Press MENU", justification=ugfx.Label.CENTER) + +ugfx.set_default_font(ugfx.FONT_SMALL) +status = ugfx.Label(0, ugfx.height() - info_height * 2 - status_height, ugfx.width(), status_height, "", justification=ugfx.Label.CENTER) + +# update loop +while True: + text = ""; + value_wifi_strength = wifi_strength() + value_battery = battery() + if value_wifi_strength: + text += "Wi-Fi: %s%%, " % int(value_wifi_strength) + if value_battery: + text += "Battery: %s%%" % int(value_battery) + status.text(text) + sleep_or_exit(0.5) diff --git a/home_pycon/python_single.png b/home_pycon/python_single.png new file mode 100644 index 0000000000000000000000000000000000000000..1eaae1ce92c48eb8ec84bf65f3e2d4ac7f0734dc GIT binary patch literal 963 zcmeAS@N?(olHy`uVBq!ia0vp^=0F_8!3HEhJn~r&q*#ibJVQ8upoSx*1IXtr@Q5sC zVBk9f!i-b3`J{n@k|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+?-kFgtj< zIEGZrc{|%bCnQv)eSh)&*IN|k+Iy`LS|O;SxTGzCBXOzFg)s4~9@Ruor$y2c4hSGIE8hWqoSso6f@_wR>mn8KCF+3T9BG{Ys=-CmU;;tqQCB4;9FmO z^6#|g^NQcU_kOp>e6vL2vL(hFk9h3y_1e-{>DX(hf66I=aRSpvhsO;JC#!=k7jXD6 zR4VAdu>$d+BuJ@89o0YN~Z}1#CH-$08D0OlBrr5X3o1~hb zUYZ$UBz~W1Q}6EUYxW7$g?)K!9V@FYx6g)k-q z`(M9YHn$No+2-NBbnk(0yRRGFy*uTM*gvO?UZoOK8}a-nAC^sB6C*M|L|%W|&Dt+E z?Df0FOyq!l;+oXUQLL8|s}`g{HKyPJMGMxT*BdHk9L!_=bZ z$)_xJ@5Np`beenC@)+?(+1KLjxt|~HW$#+EDsq$5hhLY{ovOohdLGYgFrWHJ(#lxw zLeTCEHJZT{h?kiW?5D?AvvAh^K9;dohO&)SM&r$uAa9(dncFkVqumdK II;Vst0KFE#jsO4v literal 0 HcmV?d00001 From e86d5955a3fa290548e1b6ed02091c1c3785a68e Mon Sep 17 00:00:00 2001 From: Filip Wieland Date: Sat, 15 Sep 2018 22:20:20 +0100 Subject: [PATCH 21/26] Settings screen, spit and polish --- trains/api.py | 23 ++++++ trains/departure_screen.py | 110 +++++++++++++++++++++++++++ trains/main.py | 150 ++++++++++++++++--------------------- trains/screen.py | 28 +++++++ trains/settings_screen.py | 19 +++++ trains/splash.gif | Bin 0 -> 25760 bytes trains/utils.py | 19 +++++ 7 files changed, 264 insertions(+), 85 deletions(-) create mode 100644 trains/api.py create mode 100644 trains/departure_screen.py create mode 100644 trains/screen.py create mode 100644 trains/settings_screen.py create mode 100644 trains/splash.gif create mode 100644 trains/utils.py diff --git a/trains/api.py b/trains/api.py new file mode 100644 index 0000000..4da4eaf --- /dev/null +++ b/trains/api.py @@ -0,0 +1,23 @@ +import http +import ujson +from tilda import LED + +API_URL = "https://huxley.apphb.com/all/{}?expand=true&accessToken=D102521A-06C6-44C9-8693-7A0394C757EF" + +def get_trains(station_code='LBG'): + print('trains/api: Getting trains for {}'.format(station_code)) + station_data = None + + LED(LED.RED).on() # Red for total get_trains + try: + station_json = http.get(API_URL.format( + station_code)).raise_for_status().content + LED(LED.GREEN).on() # Green for parsing + station_data = ujson.loads(station_json) + except Exception as e: + print('Error:') + print(e) + + LED(LED.RED).off() + LED(LED.GREEN).off() + return station_data diff --git a/trains/departure_screen.py b/trains/departure_screen.py new file mode 100644 index 0000000..2d50dde --- /dev/null +++ b/trains/departure_screen.py @@ -0,0 +1,110 @@ +import sleep +import ugfx +import database +from time import time +from homescreen import time_as_string +from tilda import Buttons +from trains.screen import Screen, S_CONTINUE, S_TO_SETTINGS +from trains.api import get_trains +from trains.utils import get_departure, get_title, is_red + +UPDATE_INTERVAL_SECS = 30 + +class DepartureScreen(Screen): + def __init__(self): + self.station_data = None + self.has_error = False + self.last_update = 0 + self.should_redraw = True + + self._names = None + self._old_names = None + + def enter(self): + self.next_state = S_CONTINUE + self.station_code = database.get('trains.station_code', 'LBG') + self.last_update = 0 + Buttons.enable_interrupt( + Buttons.BTN_A, + lambda t: self.set_next_state(S_TO_SETTINGS), + on_press=True, + on_release=False + ) + + def set_next_state(self, s): + self.next_state = s + + def update(self): + now = time() + if self.last_update < (now - UPDATE_INTERVAL_SECS): + print('trains/departure_screen: Updating data') + new_station_data = get_trains(self.station_code) + if new_station_data == None: + self.has_error = True + self.should_redraw = True + else: + self.station_data = new_station_data + self.has_error = False + self.should_redraw = True + self.last_update = now + + def tick(self): + self.update() + + if self.should_redraw: + if self.station_data == None: + self.show_error() + else: + self.show_trains() + else: + self._destroy_old_names() + + sleep.sleep_ms(500) + + return self.next_state + + def _get_names_container(self): + if self._names != None: + self._names.hide() + self._old_names = self._names + names = ugfx.Container(0, 25, 190, 295) + self._names = names + return names + + def _destroy_old_names(self): + if self._old_names != None: + self._old_names.destroy() + self._old_names = None + def _destroy_names(self): + if self._names != None: + self._names.destroy() + self._names = None + + def show_trains(self): + ugfx.clear() + ugfx.area(0, 0, 240, 25, ugfx.RED if self.has_error else ugfx.GRAY) + title = get_title(self.station_data['locationName'], self.has_error) + ugfx.text(5, 5, title, ugfx.WHITE if self.has_error else ugfx.BLACK) + ugfx.text(195, 5, time_as_string(), ugfx.BLUE) + + names = self._get_names_container() + names.show() + row_num = 0 + for service in self.station_data['trainServices']: + departure = get_departure(service) + if departure: + names.text(5, 15 * row_num, service['destination'][0]['locationName'], ugfx.BLACK) + ugfx.text(195, 25 + (15 * row_num), departure,ugfx.RED if is_red(service) else ugfx.BLUE) + row_num += 1 + + self.should_redraw = False + + def show_error(self): + ugfx.clear() + ugfx.text(5, 5, 'Error :(', ugfx.RED) + self.should_redraw = False + + def exit(self): + self._destroy_old_names() + self._destroy_names() + Buttons.disable_all_interrupt() diff --git a/trains/main.py b/trains/main.py index d5a0ffc..0d681e6 100644 --- a/trains/main.py +++ b/trains/main.py @@ -6,107 +6,87 @@ ___title___ = "trains" ___license___ = "MIT" ___dependencies___ = ["app", "sleep", "wifi", "http", "ugfx_helper"] ___categories___ = ["Homescreens", "Other"] +___bootstrapped___ = False -# Config - -STATION_CODE = "DEP" -API_URL = "https://huxley.apphb.com/all/{}?expand=true&accessToken=D102521A-06C6-44C9-8693-7A0394C757EF" +import database import wifi import ugfx -import http -import ujson import app import sleep +import ntp from tilda import Buttons, LED +from trains import api +from trains import screen +from trains.departure_screen import DepartureScreen +from trains.settings_screen import SettingsScreen + +def init_screen(orientation): + # initialize screen + ugfx.clear() + ugfx.orientation(orientation) + ugfx.backlight(50) + # show initial screen + # photo credit: https://www.flickr.com/photos/remedy451/8061918891 + ugfx.display_image(0, 0, 'trains/splash.gif', 90) + def init(): - # initialize screen + print('trains/main: Init') ugfx.init() - ugfx.clear() - ugfx.orientation(90) - ugfx.backlight(50) - + ntp.set_NTP_time() # ensure wifi connection if not wifi.is_connected(): - wifi.connect(show_wait_message=True) - - # show initial screen - ugfx.text(5, 5, "Will monitor station:", ugfx.BLACK) - ugfx.text(200, 5, STATION_CODE, ugfx.BLUE) - -def get_trains(): - station_data = None + wifi.connect(show_wait_message=False) - LED(LED.RED).on() # Red for total get_trains - try: - station_json = http.get(API_URL.format(STATION_CODE)).raise_for_status().content - LED(LED.GREEN).on() # Green for parsing - station_data = ujson.loads(station_json) - except: - print('Fuck') - LED(LED.RED).off() - LED(LED.GREEN).off() - return station_data - -def get_time(station_data): - return ':'.join(station_data['generatedAt'].split('T')[1].split(':')[0:2]) - -def is_red(service): - return service['isCancelled'] or service['etd'] != 'On time' - -def get_arrival(service): - if service['isCancelled']: - return 'CANX' - - if service['eta'] == 'On time': - return service['sta'] - - return service['eta'] - -def get_title(name, has_error): - if has_error: - return 'ERR ' + name - - return name - -def show_trains(station_data, has_error): +def exit(): + print('trains/main: Exit') ugfx.clear() - ugfx.area(0, 0, 240, 25, - ugfx.RED if has_error else ugfx.GRAY) - title = get_title(station_data['locationName'], has_error) - ugfx.text(5, 5, title, - ugfx.WHITE if has_error else ugfx.BLACK) - ugfx.text(195, 5, get_time(station_data), ugfx.BLUE) - names = ugfx.Container(0, 25, 190, 295) - names.show() - for idx, service in enumerate(station_data['trainServices']): - names.text(5, 15 * idx, service['destination'][0]['locationName'], ugfx.BLACK) - ugfx.text(195, 25 + (15 * idx), get_arrival(service), ugfx.RED if is_red(service) else ugfx.BLUE) + app.restart_to_default() -def show_error(): - ugfx.clear() - ugfx.text(5, 5, 'Error :(', ugfx.RED) + +app_screens = { + screen.SETTINGS: SettingsScreen(), + screen.DEPARTURES: DepartureScreen() +} + + +def get_initial_screen(): + station_code = database.get('trains.station_code', None) + if station_code == None: + return app_screens[screen.SETTINGS] + return app_screens[screen.DEPARTURES] + + +def run_screen(instance): + print('trains/main: Starting screen {}'.format(instance)) + instance.enter() + + is_running = True + next_screen_name = None + while is_running: + status, value = instance.tick() + + if status == screen.SWITCH_SCREEN: + is_running = False + next_screen_name = value + elif status == screen.EXIT_APP: + is_running = False + + print('trains/main: Stopping screen {} (next = {})'.format(instance, next_screen_name)) + instance.exit() + return next_screen_name init() -station_data = None -has_error = False -while (not Buttons.is_pressed(Buttons.BTN_A)) and (not Buttons.is_pressed(Buttons.BTN_B)) and (not Buttons.is_pressed(Buttons.BTN_Menu)): - new_station_data = get_trains() - if new_station_data == None: - has_error = True - else: - station_data = new_station_data - has_error = False - - if station_data == None: - show_error() - else: - show_trains(station_data, has_error) - sleep.sleep_ms(30 * 1000) +current_screen = get_initial_screen() +is_app_running = True +while is_app_running: + init_screen(current_screen.orientation()) + next_screen_name = run_screen(current_screen) - -# closing -ugfx.clear() -app.restart_to_default() + if next_screen_name != None: + current_screen = app_screens[next_screen_name] + else: + is_app_running = False + exit() diff --git a/trains/screen.py b/trains/screen.py new file mode 100644 index 0000000..54752c5 --- /dev/null +++ b/trains/screen.py @@ -0,0 +1,28 @@ +CONTINUE = 1 +SWITCH_SCREEN = 2 +EXIT_APP = 3 + +DEPARTURES = 10 +SETTINGS = 11 + +S_CONTINUE = (CONTINUE, None) +S_TO_SETTINGS = (SWITCH_SCREEN, SETTINGS) +S_TO_TRAINS = (SWITCH_SCREEN, DEPARTURES) +S_EXIT = (EXIT_APP, None) + + +class Screen(): + def __init__(self): + pass + + def orientation(self): + return 90 + + def enter(self): + pass + + def tick(self): + return S_CONTINUE + + def exit(self): + pass diff --git a/trains/settings_screen.py b/trains/settings_screen.py new file mode 100644 index 0000000..42f6421 --- /dev/null +++ b/trains/settings_screen.py @@ -0,0 +1,19 @@ +import database +import ugfx +from dialogs import prompt_text +from trains.screen import Screen, S_CONTINUE, S_TO_TRAINS + +class SettingsScreen(Screen): + def __init__(self): + self.next_state = S_TO_TRAINS + + def orientation(self): + return 270 + + def tick(self): + with database.Database() as db: + crs = prompt_text('Enter your station\'s CRS code', db.get('trains.station_code', '')) + db.set('trains.station_code', crs) + + return self.next_state + \ No newline at end of file diff --git a/trains/splash.gif b/trains/splash.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3d64b0d5d8c678a94f9de796ba642bee8cbe973 GIT binary patch literal 25760 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 Date: Sat, 15 Sep 2018 22:28:38 +0100 Subject: [PATCH 22/26] Bottom label, quit with MENU --- trains/bottom.gif | Bin 0 -> 1831 bytes trains/departure_screen.py | 9 ++++++++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 trains/bottom.gif diff --git a/trains/bottom.gif b/trains/bottom.gif new file mode 100644 index 0000000000000000000000000000000000000000..3966ce80fe6824d89411adc9ca683ef75c1aa719 GIT binary patch literal 1831 zcmdthiC@xp1HkbwKM+aTqo(y}Vj<%xBUouRkMtR279MNNr=D%rHcXe=;Ui|V!xEC^ zRcdKzr6ppTr3u!;4h;bX!~@MMMFmg5`#$k`+Q0F9UhjY5bJ*vQt4q)numU3ju=!W< z-|1p&y4WU2yd_9%ds2c4me_?zwuVTy{Z@lLRbzju1{YfMWmqjftaf{N?e^2s9cQEt zXQVsNN(tv=#0VKFLbf|nzUMQB+%Zb-6jitPe4X?8x_!}gUtdtTTu`|Fu5gP{xPNxB z-s4ie=jHl;UT*m2N&_Xf;lR~Kud9vTagB%Knhvv?sH`U6>q@_Pr9WHwEn9iyk7nA9 z=I;|)0uoz}Cbb+({`f=6$G}^y$5UH>NpGXyZVS58elnvyII}$@v*WkB9ijI+!m>KT zvpdf{_!RN*Q)EsT<5Ac7$6e8nyD#K*$8fqY=BqAqRaXjBR||Wt752mx^~4wV{_(so zp`Rc~sr>%5^8VW|`!oL>$b3C;_w~R%!C+R!V0Oje{WpUT z-V8l_JCyrw=+XP3N0q~mD~CB%!}%XZxWbV_k+w*reJa)#OSI2wbS1UAQmO8RR9`03 z^JIFyTwh){`cg6aXZ`5whA~0ISViO5+oth%%JKKg@yeEos+I|1>qK?ygs5#&+%_p` zpRDbel6{(zcTLxIO)I*m>s8YYs+q=~8D;NGbKgvhdiJAcwpBCR)<4%iFxNRa*F8Mn zqh09LF7)XZ)Vc+YesN%Qad2#LXnbj8Vo5u>q@P+In^_*8S(%t!nfz>SWomwPdVY0r zd2MNBZF$A8ylPlkGpw!|)(q!eCuBU1IKli& z-yAAGzb3_c?`f5c&y}WOy^=9L&efu-E6Khe(~ zUfoWaroR_-vfMoGV)9R!lhDS-7?$7k_#w#op!a=;>_~O>1)tu1>i&(^;95lGTlJ|{ zQ(!i{w9F03Gxv#I3$eK9KCh2Y{Bf##X)^lPw{#w z+2+bp2;mF5tn|2}Q__qh4`J_7=(}FcLIgVN;!BUgD{`;60BuY0%Z`R1`8=zNWm%`yyMLvY$}khVi95A9iu}0U_na7kKGL z;2e}m3A+hnqMqSn6kANm7F=>c4iFl@B4U+jK_`Q<*##meS%UgJUn9ILio>?rTwtHD zd*i)kr8&*6a(60otsCV)mSCO?+}CW2dKGm?Y+ zlvMO+{n*A#U19ENH(FA{_P5$1PHJG`{b0_e6eRq~PBrNXiXD#^ytS+3cd18+nhGltQK5 z6Ytn}Wu*djo%L=Ix_+7_Mz{r;a=}uh-v;x-D{FWQwUL9VW#1 z7dS{MvEU9F88dbi`Zvshq(_0H4222g`4w%@<$09kZ!SzMcons{9^}=g44%* zILIcUrGd>e4;DS*scDznEvd_m#!SQfWSl!BMA)Xoyi_=|>40sk0855?Ma=hpn(s|m wju5_j6X7NY{Zl|Oj>tru36r2>WL|e@Fe`JutI;-Wn;5rcI+5y6B?GYke-QNt&;S4c literal 0 HcmV?d00001 diff --git a/trains/departure_screen.py b/trains/departure_screen.py index 2d50dde..3657975 100644 --- a/trains/departure_screen.py +++ b/trains/departure_screen.py @@ -4,7 +4,7 @@ import database from time import time from homescreen import time_as_string from tilda import Buttons -from trains.screen import Screen, S_CONTINUE, S_TO_SETTINGS +from trains.screen import Screen, S_CONTINUE, S_TO_SETTINGS, S_EXIT from trains.api import get_trains from trains.utils import get_departure, get_title, is_red @@ -30,6 +30,12 @@ class DepartureScreen(Screen): on_press=True, on_release=False ) + Buttons.enable_interrupt( + Buttons.BTN_Menu, + lambda t: self.set_next_state(S_EXIT), + on_press=True, + on_release=False + ) def set_next_state(self, s): self.next_state = s @@ -97,6 +103,7 @@ class DepartureScreen(Screen): ugfx.text(195, 25 + (15 * row_num), departure,ugfx.RED if is_red(service) else ugfx.BLUE) row_num += 1 + ugfx.display_image(0, 300, 'trains/bottom.gif') self.should_redraw = False def show_error(self): From ff7c10636e0695c708526a59976c2dbdbc2ec75a Mon Sep 17 00:00:00 2001 From: Filip Wieland Date: Sat, 15 Sep 2018 23:01:29 +0100 Subject: [PATCH 23/26] Show wifi wait message --- trains/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trains/main.py b/trains/main.py index 0d681e6..422c45a 100644 --- a/trains/main.py +++ b/trains/main.py @@ -37,7 +37,7 @@ def init(): ntp.set_NTP_time() # ensure wifi connection if not wifi.is_connected(): - wifi.connect(show_wait_message=False) + wifi.connect(show_wait_message=True) def exit(): From f14fb67fd925ef11ff90f5faac253012e4cb6a42 Mon Sep 17 00:00:00 2001 From: Filip Wieland Date: Sun, 16 Sep 2018 12:16:15 +0100 Subject: [PATCH 24/26] Fix database.py docstring --- lib/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/database.py b/lib/database.py index 55d7871..0d30169 100644 --- a/lib/database.py +++ b/lib/database.py @@ -6,7 +6,7 @@ Values can be anything json can store, including a dict Usage: import database -with database.open() as db: +with database.Database() as db: print(db.get("hello", "default")) db.set("foo", "world") db.delete("bar") From 7ab2c9e18aca265c6bdb6e48069878d47e5a0a24 Mon Sep 17 00:00:00 2001 From: Marek Ventur Date: Sun, 16 Sep 2018 16:26:27 +0100 Subject: [PATCH 25/26] clarify "brainfuck" --- bf-interpreter/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bf-interpreter/main.py b/bf-interpreter/main.py index 65cd66a..c409026 100644 --- a/bf-interpreter/main.py +++ b/bf-interpreter/main.py @@ -1,4 +1,4 @@ -"""Simple brainfuck interpreter. +"""Simple brainfuck (an esoteric programming language) interpreter. Runs very slowly... prints sierpinski triangle""" From 49036697e6572b458c581d232e0c7173c97af8f0 Mon Sep 17 00:00:00 2001 From: Marek Ventur Date: Sun, 16 Sep 2018 16:27:36 +0100 Subject: [PATCH 26/26] don't bootstrap this app --- home_aerospace/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/home_aerospace/main.py b/home_aerospace/main.py index 9764bd7..2a661e3 100644 --- a/home_aerospace/main.py +++ b/home_aerospace/main.py @@ -8,7 +8,6 @@ ___license___ = "MIT" ___categories___ = ["Homescreens"] ___dependencies___ = ["homescreen", "wifi", "http", "ugfx_helper", "sleep"] ___launchable___ = False -___bootstrapped___ = True import ugfx, random, time, wifi, http, math from tilda import LED, Buttons