<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Krys Heishman (aka bun9000)</title>
    <description>The latest articles on Forem by Krys Heishman (aka bun9000) (@bun9000).</description>
    <link>https://forem.com/bun9000</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F224193%2F80f3b4fe-cc55-4e16-b483-a2ed621a41a8.jpg</url>
      <title>Forem: Krys Heishman (aka bun9000)</title>
      <link>https://forem.com/bun9000</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bun9000"/>
    <language>en</language>
    <item>
      <title>Learning C# w/ @AlSweigart [Live Coding Recap]</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Sun, 08 Dec 2019 05:52:28 +0000</pubDate>
      <link>https://forem.com/bun9000/learning-c-w-alsweigart-live-coding-recap-3mb6</link>
      <guid>https://forem.com/bun9000/learning-c-w-alsweigart-live-coding-recap-3mb6</guid>
      <description>&lt;h2&gt;
  
  
  Streamed: 12/06 on Twitch
&lt;/h2&gt;

&lt;p&gt;🔴 &lt;strong&gt;Watch&lt;/strong&gt; ⇒ Twitch VOD (replay) &lt;a href="https://www.twitch.tv/videos/518135735" rel="noopener noreferrer"&gt;Part 1&lt;/a&gt; &lt;a href="https://www.twitch.tv/videos/518190637" rel="noopener noreferrer"&gt;Part 2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Had a fun, impromptu stream Friday night learning C# with &lt;a href="https://twitch.tv/alsweigart" rel="noopener noreferrer"&gt;@AlSweigart&lt;/a&gt;! :D We took a few of his &lt;a href="https://github.com/asweigart/PythonStdioGames" rel="noopener noreferrer"&gt;Python stdio Games&lt;/a&gt; and remade them in C#.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language(s) Used:&lt;/strong&gt;  [C# .NET Core 3.1]&lt;br&gt;
&lt;strong&gt;Tech &amp;amp; lib(s) used:&lt;/strong&gt; &lt;a href="http://bit.ly/vscodenb9k" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Project Repository&lt;/strong&gt; &lt;a href="https://github.com/NinjaBunny9000/stream-stuff/tree/master/live_coded_on_stream/csharp" rel="noopener noreferrer"&gt;⭐ &lt;strong&gt;CODE&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👇 Code &amp;amp; notes from stream down below! :D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  During the stream we...
&lt;/h2&gt;

&lt;p&gt;✔ got set up with C# .NET core 3.1&lt;br&gt;
✔ made a C# ver of a python app that converts texts sPoNgEboB meme&lt;br&gt;
✔ made a C# ver of a python app that races snails &lt;code&gt;....@v&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's the code we wrote...
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;sPoNgEboB.cs&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"c# sPoNgEtExTbY aL sWeIGaRt aNd niNjAbuNnY9000. cOmeNtEr YoUr MeSsAgE:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// takes text input and passes into spongebob func&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;input_text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;output_text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"O K =&amp;gt; "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;use_upper&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"wHaT Do yoU WaNt to cOnVerT?"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;input_text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLine&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// for every character in the text&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;input_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// check if it's an upper or lower&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;use_upper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;output_text&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToUpper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// change it to upper&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;output_text&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// change it to lower&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;use_upper&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;use_upper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// flip the case&lt;/span&gt;

    &lt;span class="c1"&gt;// every 10 characters, randomly flip the case again&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;use_upper&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;use_upper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// ;D r YoU sUrE/?&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;SnailRace.cs&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// TODO: input validation&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// part 0) define vars&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;MAX_NUM_SNAILS&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// TODO&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;MAX_NAME_LENGTH&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// TODO&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;FINISH_LINE&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;num_snails&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;snail_names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;snail_progress&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OutputEncoding&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encoding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UTF8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// part 1) ask how many snails&lt;/span&gt;
    &lt;span class="c1"&gt;// TODO: validate for bad input&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"How many snails are racing today? (MAX 8?"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;num_snails&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLine&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="c1"&gt;// part 2) ask for the snail's names&lt;/span&gt;
    &lt;span class="c1"&gt;// TODO: implement character limit&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;num_snails&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"What do you want to name snail #&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;?"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;snail_names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLine&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;snail_progress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snail_names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// part 3) print out the starting line setup&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;PrintStartingLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FINISH_LINE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// pause before starting the race&lt;/span&gt;

    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;racing&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// TODO make it a do-while later too&lt;/span&gt;

    &lt;span class="c1"&gt;// part 4) big while loop that does the race&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;racing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// pause and clear the screen between each frame&lt;/span&gt;
        &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// progress a random snail&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;moving_snail&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;snail_names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_snails&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;
        &lt;span class="n"&gt;snail_progress&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;moving_snail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// check if snails have finished&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snail_progress&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;moving_snail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;FINISH_LINE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;moving_snail&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; has won!!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;racing&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// exit the program&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// render the snails to the console&lt;/span&gt;
        &lt;span class="nf"&gt;PrintStartingLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FINISH_LINE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;snail&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;snail_names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;PrintSnail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snail_progress&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;snail&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// TODO: maths so starting line moves to accommodate name length&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PrintStartingLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// print starting line 60-spaces from the finish line&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;spaces&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"START&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;spaces&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;FINISH"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"    |&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;spaces&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;|"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// TODO: align the snail's names (better)&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PrintSnail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// print spaces and then the snail's name&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;spaces&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"   "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;spaces&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// print number of dots of position and the snail&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dots&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"    "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dots&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"@v"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Live Coding Schedule
&lt;/h2&gt;

&lt;p&gt;That pretty much wraps things up for this stream. If you have any questions about the code, Python, or any of the tech used in general - swing by during a live stream and say hello!&lt;/p&gt;

&lt;p&gt;💜 &lt;strong&gt;Follow on &lt;a href="http://bit.ly/nb9kTwitch" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I stream Python coding &amp;amp; &lt;em&gt;lame jokes™&lt;/em&gt; on &lt;a href="https://twitch.tv/ninjabunny9000" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; every Tuesday, Thursday, &amp;amp; Saturday around 7pm PST.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the most up to date schedule&lt;/strong&gt;, check my pinned post on &lt;a href="https://www.twitter.com/ninjabunny9000" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>beginners</category>
      <category>livecoding</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Streamline your DEV.to writing workflow with VSCode</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Mon, 18 Nov 2019 11:03:10 +0000</pubDate>
      <link>https://forem.com/bun9000/dev-post-simulator-live-markdown-previews-in-vscode-2oki</link>
      <guid>https://forem.com/bun9000/dev-post-simulator-live-markdown-previews-in-vscode-2oki</guid>
      <description>&lt;h2&gt;
  
  
  Hello, fellow DEV publisher! 👋
&lt;/h2&gt;

&lt;p&gt;✅ Do you write all or part of your DEV posts in a text editor?&lt;/p&gt;

&lt;p&gt;✅ Do you frequently copy and paste your progress to a DEV draft, then preview it to see your progress?&lt;/p&gt;

&lt;p&gt;✅ Or are you writing all your posts directly in the DEV editor but would love to see a real-time preview side-by-side?&lt;/p&gt;

&lt;p&gt;How many times a day do you hit this button? &lt;strong&gt;💯&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbdwx7sng95jwzkxdaje.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbdwx7sng95jwzkxdaje.png" alt="preview" width="427" height="57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Well guess what!?..
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqn3yhk9yqrsb0328dlt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqn3yhk9yqrsb0328dlt.gif" alt="tada" width="480" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can streamline your DEV-writing workflow with &lt;strong&gt;a single extension&lt;/strong&gt; in VSCode and &lt;strong&gt;a few lines of CSS&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;CHECK DIS OUT 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyzl7gwa8q6fbrsgeysc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyzl7gwa8q6fbrsgeysc.png" alt="preview" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's how to get started...
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Download &lt;a href="http://bit.ly/vscodenb9k" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt; (if you're not already using it)&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced" rel="noopener noreferrer"&gt;Markdown Preview Enhanced&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;In VSCode, press &lt;code&gt;ctrl+shift+p&lt;/code&gt; - or &lt;code&gt;F1&lt;/code&gt; - and start typing  &lt;code&gt;custom css&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmaqr7jyz4963rsyr3mjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmaqr7jyz4963rsyr3mjr.png" alt="custom css" width="597" height="56"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the &lt;code&gt;Markdown Preview Enhanced: Customize CSS&lt;/code&gt; option when you see it. This will poop open a file called &lt;code&gt;style.less&lt;/code&gt;. &lt;em&gt;(you heard me...)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpsqkywwj0slmxo0nvhlv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpsqkywwj0slmxo0nvhlv.gif" alt="finger guns" width="272" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copy and paste&lt;/strong&gt; the following code in &lt;code&gt;style.less&lt;/code&gt; and save
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.markdown-preview.markdown-preview&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Palatino&lt;/span&gt; &lt;span class="n"&gt;Linotype&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;21px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0a0a0a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.markdown-preview.markdown-preview&lt;/span&gt; &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;margin-block-start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;margin-block-end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;margin-inline-start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;margin-inline-end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.markdown-preview.markdown-preview&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Segoe UI'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tahoma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Geneva&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Verdana&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.7em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.14em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.markdown-preview.markdown-preview&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Segoe UI'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tahoma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Geneva&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Verdana&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.32em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.markdown-preview.markdown-preview&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.markdown-preview.markdown-preview&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.3em&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.markdown-preview.markdown-preview&lt;/span&gt; &lt;span class="nt"&gt;blockquote&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.95em&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0.95em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.92em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.4em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#29292e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.1%&lt;/span&gt; &lt;span class="m"&gt;6%&lt;/span&gt; &lt;span class="m"&gt;0.1%&lt;/span&gt; &lt;span class="m"&gt;4%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.markdown-preview.markdown-preview&lt;/span&gt; &lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f92671&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f9f9fa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.1em&lt;/span&gt; &lt;span class="m"&gt;0.3em&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.84em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.6em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.markdown-preview.markdown-preview&lt;/span&gt; &lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#29292e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#eff0f9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.64em&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Open up a markdown file and then click the new Markdown Preview Enhanced or the shortcut chord &lt;code&gt;ctrl+k v&lt;/code&gt; to open up the preview and marvel at your grand success.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6iiu3q0vcq52xmxnwrut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6iiu3q0vcq52xmxnwrut.png" alt="mpe button" width="374" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finally, and most importantly, &lt;strong&gt;write your heart out!&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Extra stuffs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The fonts&lt;/strong&gt; used both come on Windows. I'm not sure about other OS's, but I'm sure you can find alternatives if purchasing them is beyond your budget.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.fontshop.com/families/palatino-linotype" rel="noopener noreferrer"&gt;Palatino Linotype&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fontshop.com/families/segoe-ui-symbol" rel="noopener noreferrer"&gt;Segoe UI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are a few things I couldn't figure out how to replicate (mostly the code previews and block-quote padding). At the very least, it's good enough to write the majority of your content before taking it back to a DEV draft and previewing it - hopefully saving you some time and energy.&lt;/p&gt;

&lt;p&gt;If anyone has any pointers or tweaks that could make the markdown preview better, please leave a comment below. Would love to hear from the CSS pros, especially if anyone can figure out how to match styles on code blocks. :D&lt;/p&gt;

&lt;h2&gt;
  
  
  Live Coding on Twitch
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you have any questions&lt;/strong&gt; about this article, the code, VSCode, or just wanna hang out with fellow nerds - swing by during a live stream and say hello! I stream Python shenanigans &amp;amp; &lt;em&gt;lame jokes™&lt;/em&gt; every Tuesday, Thursday, &amp;amp; Saturday at 7pm PST.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💜 &lt;strong&gt;Follow on &lt;a href="http://bit.ly/nb9kTwitch" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;*For the most up to date schedule, check my pinned post on &lt;a href="https://www.twitter.com/ninjabunny9000" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>meta</category>
      <category>writing</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>A Text-Based Battle Royale?? [Live Coding Recap]</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Sun, 17 Nov 2019 02:58:29 +0000</pubDate>
      <link>https://forem.com/bun9000/a-text-based-battle-royale-live-coding-recap-4kb2</link>
      <guid>https://forem.com/bun9000/a-text-based-battle-royale-live-coding-recap-4kb2</guid>
      <description>&lt;h2&gt;
  
  
  Streamed: 11/09 on Twitch
&lt;/h2&gt;

&lt;p&gt;🔴 &lt;strong&gt;Watch&lt;/strong&gt; ⇒ &lt;a href="https://www.twitch.tv/videos/506309596" rel="noopener noreferrer"&gt;Twitch VOD&lt;/a&gt; (replay)&lt;/p&gt;

&lt;p&gt;We started work tonight on a text-based BR game for an upcoming Python Tutorial series. Should be lots of fun! I'll include the final code in a thorough upcoming build-blog soon. :D&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language(s) Used:&lt;/strong&gt;  &lt;a href="http://bit.ly/nb9kPython" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Tech &amp;amp; lib(s) used:&lt;/strong&gt; &lt;a href="http://bit.ly/vscodenb9k" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;, &lt;a href="https://github.com/TwitchIO/TwitchIO" rel="noopener noreferrer"&gt;TwitchIO&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👇 Code &amp;amp; notes from stream down below! :D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  During the stream we...
&lt;/h2&gt;

&lt;p&gt;✔ thought up some ideas for a new tutorial&lt;br&gt;
✔ came up with the Battle Royale idea (many thanks to Jigo!)&lt;br&gt;
✔ designed the basic premise of the game&lt;br&gt;
✔ started working on the navigation portion&lt;/p&gt;

&lt;h2&gt;
  
  
  Live Coding Schedule
&lt;/h2&gt;

&lt;p&gt;That pretty much wraps things up for this stream. If you have any questions about the code, Python, or any of the tech used in general - swing by during a live stream and say hello!&lt;/p&gt;

&lt;p&gt;💜 &lt;strong&gt;Follow on &lt;a href="http://bit.ly/nb9kTwitch" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I stream Python coding &amp;amp; &lt;em&gt;lame jokes™&lt;/em&gt; on &lt;a href="https://twitch.tv/ninjabunny9000" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; every Tuesday, Thursday, &amp;amp; Saturday around 7pm PST.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the most up to date schedule&lt;/strong&gt;, check my pinned post on &lt;a href="https://www.twitter.com/ninjabunny9000" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>livecoding</category>
    </item>
    <item>
      <title>SFX &amp; Derp Wars (a Dope Wars clone) [Live Coding Recap]</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Fri, 08 Nov 2019 22:37:58 +0000</pubDate>
      <link>https://forem.com/bun9000/triggering-sfx-derp-wars-a-dope-wars-clone-live-coding-recap-oi5</link>
      <guid>https://forem.com/bun9000/triggering-sfx-derp-wars-a-dope-wars-clone-live-coding-recap-oi5</guid>
      <description>&lt;h2&gt;
  
  
  Streamed: 11/05 on Twitch
&lt;/h2&gt;

&lt;p&gt;🔴 &lt;strong&gt;Watch&lt;/strong&gt; ⇒ &lt;a href="https://www.twitch.tv/videos/504545690" rel="noopener noreferrer"&gt;Twitch VOD&lt;/a&gt; (replay)&lt;/p&gt;

&lt;p&gt;The  first goal of the night was getting a random soundbite to play during streams when certain “trigger” words are said. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Someone in chat says “wow” in a sentence and a random clip of Owen Wilson sayin “wow” plays. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then we started work on a clone of Dope Wars (which we named Derp Wars).&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait... Dope Wars?? What!?
&lt;/h2&gt;

&lt;p&gt;In what might have amounted to the best/worst idea I've ever had, chat &amp;amp; I started working on a clone of Dope Wars (aka &lt;a href="https://en.wikipedia.org/wiki/Drugwars" rel="noopener noreferrer"&gt;Drugwars&lt;/a&gt;). Dubbed Derp Wars by viewers, the plan is to use the game in educational content. &lt;strong&gt;Expect a full tutorial&lt;/strong&gt; on DEV as well as a YT post coming up in the next week or so! :D&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language(s) Used:&lt;/strong&gt;  &lt;a href="http://bit.ly/nb9kPython" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Tech &amp;amp; lib(s) used:&lt;/strong&gt; &lt;a href="http://bit.ly/vscodenb9k" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;, &lt;a href="https://github.com/TwitchIO/TwitchIO" rel="noopener noreferrer"&gt;TwitchIO&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Project Repository&lt;/strong&gt; &lt;a href="http://bit.ly/DeepThonkRepo" rel="noopener noreferrer"&gt;⭐ &lt;strong&gt;DeepThonk&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👇 Code &amp;amp; notes from stream down below! :D&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  During the stream we...
&lt;/h2&gt;

&lt;p&gt;✔ continued working on the random sfx feature we started last stream&lt;br&gt;
✔ realized we need &lt;code&gt;Honk The Planet&lt;/code&gt; t-shirts&lt;br&gt;
✔ made a note to get the &lt;code&gt;Big Dict() Energy&lt;/code&gt; t-shirts done too&lt;br&gt;
✔ created a class for interfacing with the server&lt;br&gt;
✔ got random sfx working and CELEBRATED 🎉 (wow)&lt;br&gt;
✔ freaked out because we thought the streamdeck broke&lt;br&gt;
✔ started working on Derp Wars&lt;br&gt;
✔ got a basic MVP working!&lt;br&gt;
✔ raided &lt;a href="https://www.twitch.tv/highgai" rel="noopener noreferrer"&gt;@HighGai&lt;/a&gt;, a rad Japanese/English streamer&lt;/p&gt;
&lt;h2&gt;
  
  
  Here's some code we wrote during the stream...
&lt;/h2&gt;

&lt;p&gt;In the bot app, we listen for &lt;code&gt;message events&lt;/code&gt;. When a message event comes through, we &lt;em&gt;tokenize™&lt;/em&gt; the content, check to see if a trigger word was said, then emit a websocket event to the server to play the sound if it does.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# in events.py
&lt;/span&gt;&lt;span class="n"&gt;randos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;server_interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_randos&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# get sfx trigger words from server
&lt;/span&gt;
&lt;span class="nd"&gt;@bot.listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;rando_sfx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;listens for certain words then triggers a sfx from them&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

    &lt;span class="c1"&gt;# make sure bot ignores itself
&lt;/span&gt;    &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;twitch_bot_nick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="c1"&gt;# listen for trigger words in messages
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;randos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="c1"&gt;# emit ws event to call the sfx from teh server
&lt;/span&gt;            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;emit_rando_sfx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WE HEARD A WORD!! (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# it's bird
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function that emits the ws is pretty simple. It just talks to the Flask server that hosts the browser source that queues and plays the audio.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# in server_interface.py
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;emit_rando_sfx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tell teh server a rando sfx word was said&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;sio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rando&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the server receives the ws, it's all like "Aiight, I'll let the page know." Then it &lt;em&gt;finger guns into infinity&lt;/em&gt;. 👈😎👈&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# in server.py (the Flask app)
&lt;/span&gt;&lt;span class="nd"&gt;@socketio.on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rando&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sfx_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Recievs SFX requests from bot app &amp;amp; triggers SFX on the Browser Source&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

    &lt;span class="n"&gt;word_said&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# i'm tellin ya, it's bird.
&lt;/span&gt;
    &lt;span class="c1"&gt;# choose a random file in directory
&lt;/span&gt;    &lt;span class="n"&gt;random_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;static/sfx/randos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;word_said&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# emit play rando sfx to the webpage thingy
&lt;/span&gt;    &lt;span class="n"&gt;socketio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rando triggered&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;word_said&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_file&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RANDO Triggered =&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;word_said&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From that point, the web page just listens for the websocket and queues up the audio to play.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// in sfx.js&lt;/span&gt;
&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rando triggered&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;addToQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/static/sfx/randos/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are a few tweaks we need to make to the code to make it flawless. For instance, since we’re tokenizing/splitting with spaces, this code won’t work with trigger words next to punctuation of any kind. We’ll tackle those issues on an upcoming stream. :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Live Coding Schedule
&lt;/h2&gt;

&lt;p&gt;That pretty much wraps things up for this stream. If you have any questions about the code, Python, or any of the tech used in general - swing by during a live stream and say hello!&lt;/p&gt;

&lt;p&gt;💜 &lt;strong&gt;Follow on &lt;a href="http://bit.ly/nb9kTwitch" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I stream Python coding &amp;amp; &lt;em&gt;lame jokes™&lt;/em&gt; on &lt;a href="https://twitch.tv/ninjabunny9000" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; every Tuesday, Thursday, &amp;amp; Saturday around 7pm PST.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the most up to date schedule&lt;/strong&gt;, check my pinned post on &lt;a href="https://www.twitter.com/ninjabunny9000" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>livecoding</category>
      <category>twitch</category>
    </item>
    <item>
      <title>Are you a 10x Developer? [Live Coding Recap]</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Fri, 08 Nov 2019 01:15:25 +0000</pubDate>
      <link>https://forem.com/bun9000/live-coding-recap-are-you-a-10x-developer-575</link>
      <guid>https://forem.com/bun9000/live-coding-recap-are-you-a-10x-developer-575</guid>
      <description>&lt;h2&gt;
  
  
  Streamed: 11/01 on Twitch
&lt;/h2&gt;

&lt;p&gt;🔴 &lt;strong&gt;Watch&lt;/strong&gt; ⇒ &lt;a href="https://www.twitch.tv/videos/502812223" rel="noopener noreferrer"&gt;Twitch VOD&lt;/a&gt; (replay)&lt;/p&gt;

&lt;p&gt;Tonight we hung out and celebrated news of the &lt;a href="https://mvp.microsoft.com/en-us/PublicProfile/5003518?fullName=Krissy%20Heishman" rel="noopener noreferrer"&gt;Microsoft MVP award&lt;/a&gt; then got to work on DeepThonk (the Python bot's) code!&lt;/p&gt;

&lt;h3&gt;
  
  
  You heard me. 😭🎉
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2417ca6slfaxh9cmmep6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2417ca6slfaxh9cmmep6.png" alt="BIG NEWS" width="320" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The big news dropped earlier that day and I've been on a roller-coaster of emotions ever since. Once the award kit comes in, I'll be doing a live unboxing and big fat THANK YOU stream on &lt;a href="https://twitch.tv/ninjabunny9000" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; or &lt;a href="https://www.twitter.com/ninjabunny9000" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;. :D&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language(s) Used:&lt;/strong&gt; &lt;a href="http://bit.ly/nb9kPython" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Tech &amp;amp; lib(s) used:&lt;/strong&gt; &lt;a href="http://bit.ly/vscodenb9k" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;, &lt;a href="https://github.com/TwitchIO/TwitchIO" rel="noopener noreferrer"&gt;TwitchIO&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Project Repository&lt;/strong&gt; &lt;a href="http://bit.ly/DeepThonkRepo" rel="noopener noreferrer"&gt;⭐ &lt;strong&gt;DeepThonk&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👇 Code &amp;amp; notes from stream down below! :D&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  During the stream we...
&lt;/h2&gt;

&lt;p&gt;✔ caught up with everybody in chat&lt;br&gt;
✔ announced MVP award stuffs!! YAYYY!! 🎉&lt;br&gt;
✔ loaded up some new sfx (thanks, &lt;a href="https://twitter.com/jigo" rel="noopener noreferrer"&gt;Jigo&lt;/a&gt;!)&lt;br&gt;
✔ chat had a blast going HAM with sfx &amp;amp; gifs&lt;br&gt;
✔ made an &lt;code&gt;!xlev&lt;/code&gt; command that determined your dev-level :Kappa:&lt;br&gt;
✔ whipped up a shoutout func (&lt;code&gt;!so&lt;/code&gt;) for sharing streamer info&lt;br&gt;
✔ fixed issue with founders badges not counting as a subscriber (permissions)&lt;br&gt;
✔ stretch and snack break&lt;br&gt;
✔ tried to play fortnite - &lt;em&gt;mistakes wer maed&lt;/em&gt;&lt;br&gt;
✔ started work on random sfx triggered by words in chat (almost done!)&lt;br&gt;
✔ ended the stream with a raid on &lt;a href="https://www.twitch.tv/JMSWRNR" rel="noopener noreferrer"&gt;JMSWRNR&lt;/a&gt;, a very talented artist and developer - &lt;em&gt;check them out!&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Here's some code we wrote for the bot...
&lt;/h2&gt;

&lt;p&gt;We made a highly sophisticated chat command that reveals your Dev x-level.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# in cmds.py
&lt;/span&gt;&lt;span class="nd"&gt;@bot.command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;xlev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;xlev&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, you&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re totes a &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;x dev! Congrats! 🎉&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's a sample of it in action!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frr74x6kb4kj7h22pa9bd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frr74x6kb4kj7h22pa9bd.png" alt="xlev example" width="444" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sweet. ;D
&lt;/h3&gt;

&lt;p&gt;We also whipped up a shoutout function (&lt;code&gt;!so&lt;/code&gt;) that helps spread the word about awesome streamers that pop in to our chat room.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# in cmds.py
&lt;/span&gt;&lt;span class="nd"&gt;@bot.command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;so&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;so&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;shouts out a streamer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;streamer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;streamer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check out @&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;streamer&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, a super rad streamer and friend of the channel! https://twitch.tv/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;streamer&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we have a shoutout of fellow Live Coder and DEV contributor, &lt;a class="mentioned-user" href="https://dev.to/talk2megooseman"&gt;@talk2megooseman&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux5vphf06n370nxgv4ty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux5vphf06n370nxgv4ty.png" alt="shoutout cmd" width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also fixed an issue with the &lt;a href="https://help.twitch.tv/s/article/founders-badge?language=it_IT" rel="noopener noreferrer"&gt;founder's badges&lt;/a&gt; not counting as subscriber badges. Basically, Twitch recently implemented a new feature that lets the first 5-10 subscribers to a channel proudly display their undying support. So, when Founders weren't allowed to use sub-only commands, that made Jigo cri.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faps7by5ohssm7kab19x7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faps7by5ohssm7kab19x7.png" alt="founders badge" width="583" height="35"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# in permissions-check function
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;founder&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;badges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscriber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We started working on the random SFX function as well, but since we didn't figure that during this stream, I'll document that in the recap for the stream where it all comes together and works well. :D&lt;/p&gt;

&lt;h2&gt;
  
  
  Live Coding Schedule
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For the most up to date schedule&lt;/strong&gt;, check my pinned post on &lt;a href="https://www.twitter.com/ninjabunny9000" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I stream Python coding &amp;amp; &lt;em&gt;lame jokes™&lt;/em&gt; on &lt;a href="https://twitch.tv/ninjabunny9000" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; every Tuesday, Thursday, &amp;amp; Saturday around 7pm PST.&lt;/p&gt;

&lt;p&gt;💜 &lt;strong&gt;Follow on &lt;a href="http://bit.ly/nb9kTwitch" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>livecoding</category>
      <category>twitch</category>
    </item>
    <item>
      <title>Refactoring a Python Bot [Live Coding Recap]</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Sun, 03 Nov 2019 01:24:20 +0000</pubDate>
      <link>https://forem.com/bun9000/live-stream-recap-refactoring-a-python-bot-1397</link>
      <guid>https://forem.com/bun9000/live-stream-recap-refactoring-a-python-bot-1397</guid>
      <description>&lt;h2&gt;
  
  
  Streamed: 10/29 on Twitch
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Topic(s):&lt;/strong&gt; We hung out &amp;amp; refactored DeepThonk (the python bot's) code!&lt;br&gt;
&lt;strong&gt;Language:&lt;/strong&gt; &lt;a href="http://bit.ly/nb9kPython" rel="noopener noreferrer"&gt;Python&lt;/a&gt;, JSON&lt;br&gt;
&lt;strong&gt;Tech &amp;amp; libs used:&lt;/strong&gt; &lt;a href="http://bit.ly/vscodenb9k" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;, &lt;a href="https://github.com/TwitchIO/TwitchIO" rel="noopener noreferrer"&gt;TwitchIO&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👇 You can find the notes and code from stream down below! :D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;⭐ &lt;strong&gt;Star&lt;/strong&gt; ⇒ &lt;a href="http://bit.ly/DeepThonkRepo" rel="noopener noreferrer"&gt;Project Repository&lt;/a&gt;&lt;br&gt;
💜 &lt;strong&gt;Follow&lt;/strong&gt; ⇒ on &lt;a href="http://bit.ly/nb9kTwitch" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; and &lt;a href="https://github.com/NinjaBunny9000" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🔴 &lt;strong&gt;Watch&lt;/strong&gt; ⇒ &lt;a href="https://www.twitch.tv/videos/501498825" rel="noopener noreferrer"&gt;Twitch VOD&lt;/a&gt; (replay)&lt;/p&gt;
&lt;h2&gt;
  
  
  During the stream we...
&lt;/h2&gt;

&lt;p&gt;✔ moved !project from FAQ's into it's own command&lt;br&gt;
✔ made !project settable from chat&lt;br&gt;
✔ moved all other commands to commands.py&lt;br&gt;
✔ cleaned up commands &amp;amp; commented uncommented funcs&lt;br&gt;
✔ created a &lt;code&gt;command&lt;/code&gt; module and moved all commands in there&lt;br&gt;
✔ created a command to enable/disable shoutouts&lt;br&gt;
✔ created a &lt;code&gt;!raider&lt;/code&gt; command to thank (and shoutout) raiders!&lt;/p&gt;
&lt;h2&gt;
  
  
  Here's some of the code we wrote...
&lt;/h2&gt;

&lt;p&gt;Shoutouts can be a little too much sometimes when we're actively developing the bot, so we created a chat function to turn them on or off on the fly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# in commands.cmds
&lt;/span&gt;&lt;span class="nd"&gt;@bot.command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;shoutouts&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;shoutouts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;toggles shoutouts on or off&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_setting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;shoutouts&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_setting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;shoutouts&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Shoutouts are off now.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_setting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;shoutouts&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Shoutouts are back on!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And, at the recommendation of chat, we created a command to shout out (and thank) raiders.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# in commands.cmds
&lt;/span&gt;&lt;span class="nd"&gt;@bot.command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;raider&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;raider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;shouts &amp;amp; thanks raiders&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# strip @'s if they passed in user name arg with one
&lt;/span&gt;        &lt;span class="n"&gt;raider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;raider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ninjab1Bigups to @&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;raider&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; for the sick raid! Check them out at https://twitch.tv/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;raider&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>python</category>
      <category>beginners</category>
      <category>livecoding</category>
      <category>twitch</category>
    </item>
    <item>
      <title>A Better Quoting System [Live Coding Recap]</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Sun, 27 Oct 2019 22:26:29 +0000</pubDate>
      <link>https://forem.com/bun9000/live-coding-recap-a-clever-quoting-system-1hal</link>
      <guid>https://forem.com/bun9000/live-coding-recap-a-clever-quoting-system-1hal</guid>
      <description>&lt;h2&gt;
  
  
  Streamed: 10/27 on Twitch
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Topic(s):&lt;/strong&gt; We created a persistent data system for the Twitch Bot&lt;br&gt;
&lt;strong&gt;Language:&lt;/strong&gt; &lt;a href="http://bit.ly/nb9kPython" rel="noopener noreferrer"&gt;Python&lt;/a&gt;, JSON&lt;br&gt;
&lt;strong&gt;Tech &amp;amp; libs used:&lt;/strong&gt; &lt;a href="http://bit.ly/vscodenb9k" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;, &lt;a href="https://github.com/TwitchIO/TwitchIO" rel="noopener noreferrer"&gt;TwitchIO&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👇 You can find the code we wrote on stream down below! :D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;⭐ &lt;strong&gt;Star&lt;/strong&gt; ⇒ &lt;a href="http://bit.ly/DeepThonkRepo" rel="noopener noreferrer"&gt;Project Repository&lt;/a&gt;&lt;br&gt;
💜 &lt;strong&gt;Follow&lt;/strong&gt; ⇒ on &lt;a href="http://bit.ly/nb9kTwitch" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; and &lt;a href="https://github.com/NinjaBunny9000" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🔴 &lt;strong&gt;Watch&lt;/strong&gt; ⇒ &lt;a href="https://www.twitch.tv/videos/500163411" rel="noopener noreferrer"&gt;Twitch VOD&lt;/a&gt; (replay)&lt;/p&gt;
&lt;h2&gt;
  
  
  During the stream we...
&lt;/h2&gt;

&lt;p&gt;✔ unboxed the a hat from DEV!! Ty!!&lt;br&gt;
✔ changed voice on tts to Brian&lt;br&gt;
✔ moved !project command to DeepThonk&lt;br&gt;
✔ get !quoth partially working&lt;br&gt;
✔ handled a case of key-errors&lt;br&gt;
✔ tested out the fixes - it works!&lt;br&gt;
✔ worked on vscode for the next live coding article for a bit&lt;br&gt;
✔ ended the night playing video games w/community&lt;/p&gt;
&lt;h2&gt;
  
  
  Making the quote system
&lt;/h2&gt;

&lt;p&gt;We made a command called &lt;code&gt;!quoth&lt;/code&gt; that takes a user name as an argument and saves the last thing that user said as a quote.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;BestCoderNA:&lt;/strong&gt; I'm not totally useless. I can be used as a bad example!&lt;br&gt;
&lt;strong&gt;F1SavesLives:&lt;/strong&gt; !quoth @BestCoderNA&lt;br&gt;
&lt;strong&gt;QUOTE SAVED:&lt;/strong&gt; "I'm not totally useless. I can be used as a bad example!" - @BestCoderNA&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's the entry point to the quoth feature. It's an async command registered in the bot's event loop. You invoke it by sending &lt;code&gt;!quoth&lt;/code&gt; in chat.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# commands.py
&lt;/span&gt;&lt;span class="nd"&gt;@bot.command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quoth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;quoth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;the raven, nevermore. nevermore.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# tokenize™
&lt;/span&gt;    &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# match case for msg database keys
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# strip the @ if tagged
&lt;/span&gt;        &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quoth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every message sent in chat is added to a dictionary with a key of the user name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# called in event_message():
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_last_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# ignore commands
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# strip tags if tagged
&lt;/span&gt;        &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;saved: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our &lt;code&gt;data&lt;/code&gt; object, which is our JSON "database" interface, we use the quoth method to append the python quote to a list of quotes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# in the `data` object, an instance of DataInterface
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;quoth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;take in an author name and add the last thing said from them&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# check if they've even said anything yet
&lt;/span&gt;        &lt;span class="n"&gt;incoming_quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; hasn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t said anything yet...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# pull the json data to an object
&lt;/span&gt;    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quotes.json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;json_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;quotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# add all the quotes from json to a list
&lt;/span&gt;        &lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;incoming_quote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# add the new quote to the end of the list
&lt;/span&gt;        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;QUOTE SAVED! &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;incoming_quote&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# rewrite with the new quote
&lt;/span&gt;    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quotes.json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;json_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# dump it back in to jso
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here's the JSON "database" after we tested it out with a few quotes!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jigokuniku"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TBH, some best practices are really only ever learned by getting annoyed at the bad practice"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NinjaBunny9000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JUST 👏 BECAUSE 👏 IT'S 👏 EATABLE 👏 DOESN'T 👏 MEAN 👏 IT'S 👏 EDIBLE 👏"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"J0nnyclueless"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I sometimes get kernel panic attacks"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sockelo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Forgive them, for they know not what they compile."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>python</category>
      <category>beginners</category>
      <category>livecoding</category>
      <category>twitch</category>
    </item>
    <item>
      <title>Storing Bot Commands in JSON Objects [Live Coding Recap]</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Sun, 27 Oct 2019 10:40:59 +0000</pubDate>
      <link>https://forem.com/bun9000/live-coding-recap-storing-bot-commands-in-json-objects-25cd</link>
      <guid>https://forem.com/bun9000/live-coding-recap-storing-bot-commands-in-json-objects-25cd</guid>
      <description>&lt;h2&gt;
  
  
  Streamed: 10/24 on Twitch
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Topic(s):&lt;/strong&gt; Command-system using persistent data with JSON &amp;amp; a simple permissions system&lt;br&gt;
&lt;strong&gt;Language:&lt;/strong&gt; &lt;a href="http://bit.ly/nb9kPython" rel="noopener noreferrer"&gt;Python&lt;/a&gt;, JSON&lt;br&gt;
&lt;strong&gt;Tech &amp;amp; libs used:&lt;/strong&gt; &lt;a href="http://bit.ly/vscodenb9k" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;, &lt;a href="https://github.com/TwitchIO/TwitchIO" rel="noopener noreferrer"&gt;TwitchIO&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;Star&lt;/strong&gt; ⇒ &lt;a href="http://bit.ly/DeepThonkRepo" rel="noopener noreferrer"&gt;Project Repository&lt;/a&gt;&lt;br&gt;
💜 &lt;strong&gt;Follow&lt;/strong&gt; ⇒ on &lt;a href="http://bit.ly/nb9kTwitch" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; and &lt;a href="https://github.com/NinjaBunny9000" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🔴 &lt;strong&gt;Watch&lt;/strong&gt; ⇒ &lt;a href="https://www.twitch.tv/videos/499156139" rel="noopener noreferrer"&gt;Twitch VOD&lt;/a&gt; (replay)&lt;/p&gt;

&lt;h2&gt;
  
  
  During the stream we...
&lt;/h2&gt;

&lt;p&gt;✔ tested out new stream scenes&lt;br&gt;
✔ got raided by kim &amp;amp; lana&lt;br&gt;
✔ generated commands from json data&lt;br&gt;
✔ made a command for adding commands to the json&lt;br&gt;
✔ made a simple permissions system&lt;br&gt;
✔ got raided by mr_sport &amp;amp;&amp;amp; codinggarden at the same time!&lt;br&gt;
✔ wrapped things up with a few games of fortnite with theprimeagen &amp;amp; friends&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>livecoding</category>
      <category>twitch</category>
    </item>
    <item>
      <title>Persistent Data w/JSON [Live Coding Recap]</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Sat, 26 Oct 2019 22:47:34 +0000</pubDate>
      <link>https://forem.com/bun9000/live-coding-recap-persistent-data-w-json-10lj</link>
      <guid>https://forem.com/bun9000/live-coding-recap-persistent-data-w-json-10lj</guid>
      <description>&lt;h2&gt;
  
  
  Streamed: 10/22 on Twitch
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Topic(s):&lt;/strong&gt; We created a persistent data system for the Twitch Bot&lt;br&gt;
&lt;strong&gt;Language:&lt;/strong&gt; &lt;a href="http://bit.ly/nb9kPython" rel="noopener noreferrer"&gt;Python&lt;/a&gt;, JSON&lt;br&gt;
&lt;strong&gt;Tech &amp;amp; libs used:&lt;/strong&gt; &lt;a href="http://bit.ly/vscodenb9k" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;, &lt;a href="https://github.com/TwitchIO/TwitchIO" rel="noopener noreferrer"&gt;TwitchIO&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;Star&lt;/strong&gt; ⇒ &lt;a href="http://bit.ly/DeepThonkRepo" rel="noopener noreferrer"&gt;Project Repository&lt;/a&gt;&lt;br&gt;
💜 &lt;strong&gt;Follow&lt;/strong&gt; ⇒ on &lt;a href="http://bit.ly/nb9kTwitch" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; and &lt;a href="https://github.com/NinjaBunny9000" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🔴 &lt;strong&gt;Watch&lt;/strong&gt; ⇒ &lt;a href="https://www.twitch.tv/videos/498295826" rel="noopener noreferrer"&gt;Twitch VOD&lt;/a&gt; (replay)&lt;/p&gt;

&lt;h2&gt;
  
  
  During the stream we...
&lt;/h2&gt;

&lt;p&gt;✔ showed off some new features and went over updates to the repo&lt;br&gt;
✔ identify where we already have hardcoded infos&lt;br&gt;
✔ got distracted by a bug with the tts system&lt;br&gt;
✔ took a break and ate sum noms&lt;br&gt;
✔ FEEXED THE BUG&lt;br&gt;
✔ created a json settings file for persistent data&lt;br&gt;
✔ answered some viewer's question&lt;br&gt;
✔ setup a config obj and interfaced w/it&lt;br&gt;
✔ made tts, sfx, and shoutouts enable/disable settings persistent&lt;br&gt;
✔ moved the FAQ to json &amp;amp; generated commands from it&lt;br&gt;
✔ tried to get it writing the commands... but THINGS BROKE&lt;br&gt;
✔ prime raided - 1337H4X&lt;br&gt;
✔ fixed the thing! FAQ's are writing to JSON now! yay&lt;br&gt;
✔ broke another thing - will tackle next stream&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>livecoding</category>
      <category>twitch</category>
    </item>
    <item>
      <title>Let's make a Twitch bot with Python!</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Fri, 18 Oct 2019 11:35:00 +0000</pubDate>
      <link>https://forem.com/bun9000/let-s-make-a-twitch-bot-with-python-2nd8</link>
      <guid>https://forem.com/bun9000/let-s-make-a-twitch-bot-with-python-2nd8</guid>
      <description>&lt;p&gt;This tutorial gets you up and running with a simple chat bot for Twitch channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who's this tutorial for?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Beginners to coding and experienced coders new to Python.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Contents
&lt;/h2&gt;

&lt;p&gt;We'll start out by setting up the accounts, getting the secrets, and installing the softywares. Then we'll setup and code the bot. By the end of this tutorial you should be ready to start adding your own custom commands.&lt;/p&gt;

&lt;p&gt;BUT FIRST... we &lt;strong&gt;need&lt;/strong&gt; to make sure we have our credentials in order. 👏&lt;/p&gt;

&lt;h2&gt;
  
  
  Papers, please!
&lt;/h2&gt;

&lt;h4&gt;
  
  
  📢 &lt;a href="https://www.youtube.com/watch?v=Kd2b7PYyZic" rel="noopener noreferrer"&gt;Glory to Arstotzka!&lt;/a&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Make an account on &lt;a href="https://twitch.tv/" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; (for your bot) or use the one you stream with. Make it something cool like &lt;code&gt;RealStreamer69&lt;/code&gt; 😎&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://twitchapps.com/tmi/" rel="noopener noreferrer"&gt;Request an oauth code&lt;/a&gt;. You'll need to login and give the app permissions to generate it for you.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.twitch.tv/console/apps/create" rel="noopener noreferrer"&gt;Register your app with Twitch dev&lt;/a&gt; and request a client-id (so you can interface with Twitch's API)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep the oauth and client id somewhere handy but not public. You'll need them later to configure the bot.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;PROTIP™&lt;/em&gt; -- &lt;em&gt;Keep it secret. Keep it safe.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Install all the things! 🧹
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install Python 3.6 or 3.7 -- &lt;a href="https://www.python.org/downloads/release/python-375/" rel="noopener noreferrer"&gt;Windows&lt;/a&gt; // &lt;a href="https://www.python.org/downloads/release/python-375/" rel="noopener noreferrer"&gt;Linux&lt;/a&gt; // &lt;a href="https://www.python.org/downloads/release/python-375/" rel="noopener noreferrer"&gt;OS X&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install PIPENV. In the console, run ⇒ &lt;code&gt;pip install pipenv&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Create a cozy home for the bot to live in
&lt;/h3&gt;

&lt;p&gt;Virtual environments require a couple extra steps to set up but make developing Python apps a breeze. For this tutorial, we'll use &lt;a href="https://github.com/pypa/pipenv" rel="noopener noreferrer"&gt;PIPENV&lt;/a&gt; which marries pip and venv into a single package.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the console, navigate to your working directory&lt;/li&gt;
&lt;li&gt;Run ⇒ &lt;code&gt;pipenv --python 3.6&lt;/code&gt; or  &lt;code&gt;pipenv --python 3.7&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;This is going to create &lt;code&gt;pipfile&lt;/code&gt; and &lt;code&gt;piplock&lt;/code&gt;. They hold venv info like Python version and libraries you install.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Then run ⇒ &lt;code&gt;pipenv install twitchio&lt;/code&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuring and authorizing the bot
&lt;/h2&gt;

&lt;p&gt;Create 2 files in your working directory. One called &lt;code&gt;bot.py&lt;/code&gt; and another called  &lt;code&gt;.env&lt;/code&gt; (no file name, just the extension - it's weird, I know).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/.env&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Your secrets will live inside the &lt;code&gt;.env&lt;/code&gt; file. Add the oauth token and client-id from above after the &lt;code&gt;=&lt;/code&gt; in the file. Fill in the other vars as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env&lt;/span&gt;
&lt;span class="nv"&gt;TMI_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;oauth:
&lt;span class="nv"&gt;CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;BOT_NICK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;BOT_PREFIX&lt;/span&gt;&lt;span class="o"&gt;=!&lt;/span&gt;
&lt;span class="nv"&gt;CHANNEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;/bot.py&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Inside &lt;code&gt;bot.py&lt;/code&gt;, import the libraries we'll need and create the bot obj that we'll start in the next step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# bot.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt; &lt;span class="c1"&gt;# for importing env vars for the bot to use
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;twitchio.ext&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;

&lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Bot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;# set up the bot
&lt;/span&gt;    &lt;span class="n"&gt;irc_token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;TMI_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CLIENT_ID&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;nick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOT_NICK&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOT_PREFIX&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;initial_channels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CHANNEL&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;PROTIP™&lt;/em&gt; -- When we run &lt;code&gt;bot.py&lt;/code&gt; using PIPENV, it first loads the variables from the &lt;code&gt;.env&lt;/code&gt; file into the virtual environment and then runs &lt;code&gt;bot.py&lt;/code&gt;. So, inside this venv, we have acess (on an instance-basis) to these variables. We're going to use python's &lt;code&gt;os&lt;/code&gt; module to import them, just like we would import environment variables on our native environment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;At the bottom&lt;/strong&gt; of the file, we need to make sure the bot runs when we call &lt;code&gt;bot.py&lt;/code&gt; directly using &lt;code&gt;if __name__ == "__main__":&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# bot.py
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  WAKE BOT UP (wake bot up inside!)
&lt;/h2&gt;

&lt;p&gt;Let's test the bot and make sure it can connect to Twitch.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the console, run ⇒ &lt;code&gt;pipenv run python bot.py&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If it worked&lt;/strong&gt;, you shouldn't get any errors - that means the environment variables loaded correctly and your bot successfully connected to Twitch!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you got errors&lt;/strong&gt;, check out the next section before moving on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Error: Can't wake up. [save me]
&lt;/h2&gt;

&lt;p&gt;A wild &lt;code&gt;Request to join the channel has timed out. Make sure the channel exists.&lt;/code&gt; appears. You evade with..&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make sure you have the right tokens (oauth and client-id) in the .env file and that they're in the same directory/folder as &lt;code&gt;bot.py&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your directory structure at this point should look like this...&lt;/p&gt;



&lt;pre&gt;
working-directory/
├─ .env
├─ bot.py
├─ Pipfile
└─ Pipfile.lock
&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If that still doesn't fix it, comment below and we'll sort it out for ya!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Adding some functionality to the bot
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Greet the chat room!
&lt;/h3&gt;

&lt;p&gt;Back to &lt;code&gt;bot.py&lt;/code&gt;.... Below the bot object, let's create a function called &lt;code&gt;event_ready&lt;/code&gt; with the decorator &lt;code&gt;@bot.event&lt;/code&gt;. This function will run once when we start the bot. It then reports to terminal and chat that it successfully connected to Twitch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# bot.py, below bot object
&lt;/span&gt;&lt;span class="nd"&gt;@bot.event&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;event_ready&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Called once when the bot goes online.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOT_NICK&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is online!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_ws&lt;/span&gt;  &lt;span class="c1"&gt;# this is only needed to send messages within event_ready
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_privmsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CHANNEL&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/me has landed!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go ahead and &lt;strong&gt;test the bot again&lt;/strong&gt;. It should greet chat when it comes online now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiagv4uwysuzwbyu1yq67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiagv4uwysuzwbyu1yq67.png" alt="landed" width="286" height="41"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Respond to messages in chat
&lt;/h3&gt;

&lt;p&gt;Next up, we're going to add a function that's run every time a message is sent in your channel. You can add all sorts of logic here later, but we'll start out with making sure the bot ignores itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# bot.py, below event_ready
&lt;/span&gt;&lt;span class="nd"&gt;@bot.event&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;event_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Runs every time a message is sent in chat.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

    &lt;span class="c1"&gt;# make sure the bot ignores itself and the streamer
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOT_NICK&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, we'll drop in a line of code that will annoyingly echo back every message sent in chat. ᴷᵃᵖᵖᵃ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# bot.py, in event_message, below the bot-ignoring stuff
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the bot and check it out!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4v38pjaighbvrtt9dxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4v38pjaighbvrtt9dxn.png" alt="rip" width="391" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;PROTIP™&lt;/em&gt; -- Comment out that line now cuz it's actually really annoying.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Making a chat command
&lt;/h3&gt;

&lt;p&gt;Any command you make needs to follow this format when defining them..&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decorated with &lt;code&gt;@bot.command(name='whatever')&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Be asynchronous functions with names that match the &lt;code&gt;name&lt;/code&gt; variable in the decorator&lt;/li&gt;
&lt;li&gt;Pass the message context in through the function&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How the function works and what it does is all up to you. For this example, we'll create a command called &lt;code&gt;!test&lt;/code&gt; that says &lt;code&gt;test passed!&lt;/code&gt; in chat when we call it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# bot.py, below event_message function
&lt;/span&gt;&lt;span class="nd"&gt;@bot.command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test passed!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before this can work, we need to make sure that the bot knows to listen for commands coming through.&lt;/p&gt;

&lt;p&gt;Add this just below the ignore bot code in &lt;code&gt;event_message&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="c1"&gt;#bot.py, in event_message, below the bot ignore stuffs
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handle_commands&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alright! Time to test it out. Reboot the bot and send &lt;code&gt;!test&lt;/code&gt; in chat!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1iut8akjfj0oq7iqn760.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1iut8akjfj0oq7iqn760.png" alt="test passed" width="287" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Responding to specific messages
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Tell my bot I said... "Hello."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can respond to specific messages in your chat too, they don't have to be &lt;code&gt;!commands&lt;/code&gt;. Let's write some code that says hi when people say hello.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="c1"&gt;# bot.py, at the bottom of event_message
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hi, @&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go ahead and test it out! You've got the framework to start buildng your bot and adding commands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F72xycso49l6hovyu1x8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F72xycso49l6hovyu1x8l.png" alt="tell my bot i said " width="352" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's what you should have when you're done
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/bot.py&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;twitchio.ext&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;

&lt;span class="c1"&gt;# set up the bot
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Bot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;irc_token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;TMI_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CLIENT_ID&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;nick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOT_NICK&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOT_PREFIX&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;initial_channels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CHANNEL&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@bot.event&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;event_ready&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Called once when the bot goes online.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOT_NICK&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is online!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_ws&lt;/span&gt;  &lt;span class="c1"&gt;# this is only needed to send messages within event_ready
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_privmsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CHANNEL&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/me has landed!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@bot.event&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;event_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Runs every time a message is sent in chat.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

    &lt;span class="c1"&gt;# make sure the bot ignores itself and the streamer
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BOT_NICK&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handle_commands&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# await ctx.channel.send(ctx.content)
&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hi, @&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@bot.command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test passed!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And ofc your &lt;code&gt;.env&lt;/code&gt; with your secrets and a &lt;code&gt;pipfile&lt;/code&gt; and &lt;code&gt;Piplock&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I've uploaded the files to a &lt;a href="https://github.com/NinjaBunny9000/barebones-twitch-bot/pull/1" rel="noopener noreferrer"&gt;github repo&lt;/a&gt; too, if that's your thing.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Congrats!! 🥳🎉
&lt;/h2&gt;

&lt;p&gt;You've made it this far.. You know what that means? Time to celebrate by &lt;a href="http://bit.ly/SOCKSPLS" rel="noopener noreferrer"&gt;clicking this GitKraken referral link&lt;/a&gt; and signing up so I can get &lt;a href="https://www.gitkraken.com/referrals" rel="noopener noreferrer"&gt;free socks&lt;/a&gt; (or maybe a Tesla? 😎).&lt;/p&gt;

&lt;p&gt;Also, feel free to check out the &lt;a href="https://dev.to/ninjabunny9000/live-coding-recap-make-a-twitch-bot-with-python-2coe"&gt;Live Coding Stream recap&lt;/a&gt; where we developed this tutorial. Shoutouts to everyone in chat that collaborated!&lt;/p&gt;

&lt;h2&gt;
  
  
  What do you want to do next?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Questions? Comments? Ideas? Let me know in the comments below!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'll be following up to this post soon with some tips on how to get the most out of the TwitchIO library -- more stuff that's not really well-documented and was a PITA to figure out, like how to get the author, using badges for permissions, etc.&lt;/p&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>twitch</category>
    </item>
    <item>
      <title>Twitch Bot 101 (Python) [Live Coding Recap]</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Fri, 18 Oct 2019 10:59:43 +0000</pubDate>
      <link>https://forem.com/bun9000/live-coding-recap-make-a-twitch-bot-with-python-2coe</link>
      <guid>https://forem.com/bun9000/live-coding-recap-make-a-twitch-bot-with-python-2coe</guid>
      <description>&lt;h2&gt;
  
  
  Streamed: 10/18 on Twitch
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Topic(s):&lt;/strong&gt; We created a &lt;strong&gt;&lt;a href=""&gt;bare-bones Twitch chat bot&lt;/a&gt;&lt;/strong&gt; &amp;amp; &lt;strong&gt;&lt;a href="http://bit.ly/twitchbot101" rel="noopener noreferrer"&gt;companion tutorial post&lt;/a&gt;&lt;/strong&gt; on dev.&lt;br&gt;
&lt;strong&gt;Language:&lt;/strong&gt; &lt;a href="http://bit.ly/nb9kPython" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Tech &amp;amp; libs used:&lt;/strong&gt; &lt;a href="http://bit.ly/vscodenb9k" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;, &lt;a href="https://github.com/TwitchIO/TwitchIO" rel="noopener noreferrer"&gt;TwitchIO&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;Star&lt;/strong&gt; ⇒ &lt;a href="http://bit.ly/pythontwitchbot" rel="noopener noreferrer"&gt;Project Repository&lt;/a&gt;&lt;br&gt;
💜 &lt;strong&gt;Follow&lt;/strong&gt; ⇒ on &lt;a href="http://bit.ly/nb9kTwitch" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; and &lt;a href="https://github.com/NinjaBunny9000" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🔴 &lt;strong&gt;Watch&lt;/strong&gt; ⇒ &lt;a href="https://www.twitch.tv/videos/496123267" rel="noopener noreferrer"&gt;Twitch VOD&lt;/a&gt; (replay)&lt;/p&gt;

&lt;h2&gt;
  
  
  During the stream we...
&lt;/h2&gt;

&lt;p&gt;✔ took a few minutes to get everything up and running cuz what hte heck is going on i got home from work late and im so disoriented 😨&lt;br&gt;
✔ set up the project and started outlining the tutorial&lt;br&gt;
✔ jigo ate almonds on mic and i wanted to die&lt;br&gt;
✔ was then sent unsolicited door pics (r00d)&lt;br&gt;
✔ finished writing the first draft of the tutorial&lt;br&gt;
✔ tested and reviewed the tutorial.. so far so good!&lt;br&gt;
✔ put some polish on the tutorial and edited a bit more&lt;br&gt;
✔ remembered i forgot do kit.com setup &amp;amp; post.. gotta do that soon!&lt;br&gt;
✔ and then i remembered forgot to do laundry.. AGAIN!&lt;br&gt;
✔ published draft to dev &amp;amp; reviewed&lt;br&gt;
✔ chat helped a ton with typos &amp;amp; grammer! ty!&lt;br&gt;
✔ signed off and raided &lt;a href="https://www.twitch.tv/ingameasylum" rel="noopener noreferrer"&gt;InGameAsylum&lt;/a&gt;.. amazing stream production!&lt;/p&gt;

&lt;h2&gt;
  
  
  We also came up with some ideas...
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Doing a git/repo basics stream&lt;/li&gt;
&lt;li&gt;Advanced topics w/TwitchIO like wrapping event_message and other listeners in decorators so we can use them like &lt;a class="mentioned-user" href="https://dev.to/bot"&gt;@bot&lt;/a&gt;.commands - &lt;code&gt;@meortel&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>twitch</category>
      <category>streaming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>5 Useful VSCode Extensions for Live Coding</title>
      <dc:creator>Krys Heishman (aka bun9000)</dc:creator>
      <pubDate>Thu, 17 Oct 2019 10:53:39 +0000</pubDate>
      <link>https://forem.com/bun9000/5-useful-vscode-extensions-for-live-coding-239b</link>
      <guid>https://forem.com/bun9000/5-useful-vscode-extensions-for-live-coding-239b</guid>
      <description>&lt;p&gt;Live-streaming a development process introduces some unique challenges. Aside from the obvious challenge of edutaining a large group of people (for potentially hours on end), you're also collaborating with them while doing your best to stay on task and not lose their focus either.&lt;/p&gt;

&lt;p&gt;Here's a list of 5 extensions I've found extremely useful for overcoming those challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;a href="http://bit.ly/2MRxkI3" rel="noopener noreferrer"&gt;Twitch Highlighter&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fclarkio%2Fvscode-twitch-highlighter%2Fraw%2Fmaster%2Fresources%2Fintro-vid.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fclarkio%2Fvscode-twitch-highlighter%2Fraw%2Fmaster%2Fresources%2Fintro-vid.gif" alt="line highlighter" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This awesome extension (made during Live Coding streams by a fellow &lt;a href="http://bit.ly/livecoders" rel="noopener noreferrer"&gt;Live Coders&lt;/a&gt; teammate &lt;a href="http://bit.ly/2P5bTGj" rel="noopener noreferrer"&gt;Clarkio&lt;/a&gt;) lets viewers help you debug your code — highlight lines with a simple chat command!&lt;/p&gt;

&lt;p&gt;Missing a semi-colon? &lt;code&gt;!line 36&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;a href="http://bit.ly/2IUQo6P" rel="noopener noreferrer"&gt;Bracket Pair Colorizer 2&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0wxpnenptoldbt17ptl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0wxpnenptoldbt17ptl.png" alt="bracket pair colorizer" width="370" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a perfect world, your viewers could give you 100% of their attention 100% of the time. In reality, they're probably also working on their own projects, cooking, or second-screening at their desk. Help your viewers quickly parse what's going on at a glance and feel less disoriented when they look away for a few seconds, glance back, and a few parens or curlies moved around.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;PRO-TIP™&lt;/em&gt; - Extensions that help viewers more easily spot syntax errors make it easier to mob-program and debug with your viewers!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. &lt;a href="http://bit.ly/33EIhDv" rel="noopener noreferrer"&gt;TODO+&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfs75jsisz1354em2tca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfs75jsisz1354em2tca.png" alt="todo+ example" width="493" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep track of current tasks, ideas, bugs you find, and more with this extremely useful but little-known extension. Shortcuts like &lt;code&gt;alt+s&lt;/code&gt; to start, &lt;code&gt;alt+d&lt;/code&gt; to mark as done, and &lt;code&gt;alt+c&lt;/code&gt; to cancel make TODO+ an easy to use task tracker. The extension also supports custom symbols for check boxes and custom-defined tags.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;PRO-TIP™&lt;/em&gt; - Tracking stream tasks and progress in a list is a good Live Coding tactic. Viewers often drop-in mid stream and need help getting  oriented and caught up. After the stream, use the list to write a recap blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. &lt;a href="http://bit.ly/2qjWDuB" rel="noopener noreferrer"&gt;Live Share&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnm9mrm08iiny8q040g4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnm9mrm08iiny8q040g4.png" alt="live share" width="704" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pair program with guests on stream with Live Share! It's an excellent collaboration tool and a must have for every Live Coder's toolkit.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. &lt;a href="https://marketplace.visualstudio.com/items?itemName=ExodiusStudios.comment-anchors" rel="noopener noreferrer"&gt;Comment Anchors&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fea74sejmv7hak9bspois.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fea74sejmv7hak9bspois.png" alt="comment anchors" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is another useful (but little-known) tool to help viewers follow along and stay engaged. Comment Anchors supports custom tags and colors as well, so you can use them to label any sort of comment!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;PRO-TIP™&lt;/em&gt; - If you feel lost during a stream, sift through Comment Anchor tags in the side bar for TODO's and refactor tasks you can focus on until you figure out what to do next!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  EDIT: Honorable Mentions
&lt;/h2&gt;

&lt;p&gt;I wanted to update this post with some great suggestions from the dev.to community in the comments below that I've adopted for regular use on Twitch.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=ybaumes.highlight-trailing-white-spaces" rel="noopener noreferrer"&gt;Highlight Trailing Whitespaces&lt;/a&gt; &amp;amp; &lt;a href="https://marketplace.visualstudio.com/items?itemName=byi8220.indented-block-highlighting" rel="noopener noreferrer"&gt;Indent Block Highlighting&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr60qsd1lk0uw6x64od7y.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr60qsd1lk0uw6x64od7y.gif" alt="whitespace" width="822" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shoutout to &lt;a href="https://dev.to/juancarlospaco"&gt;Juan Carlos&lt;/a&gt; for these recommendations! Not only does this scratch a visual itch and keep code looking clean, but it's another thing viewers/chat can help out with (esp in Python where white-space matters!)&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://marketplace.visualstudio.com/items?itemName=richie5um2.snake-trail" rel="noopener noreferrer"&gt;Snake Trail&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vwamxbkhic7qo3bez2z.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vwamxbkhic7qo3bez2z.gif" alt="snakes!" width="560" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks &lt;a href="https://dev.to/richie5um"&gt;Rich Somerfield&lt;/a&gt; for developing this extension. It's so purty!&lt;/p&gt;

&lt;h2&gt;
  
  
  Share your favs!
&lt;/h2&gt;

&lt;p&gt;What are your favorite extensions for Live Coding?&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>vscode</category>
      <category>livecoding</category>
      <category>career</category>
    </item>
  </channel>
</rss>
