Just some recent changes

This commit is contained in:
Russell 2018-09-19 17:04:38 +00:00
parent ce32bc223b
commit 9247e2f2e2
20 changed files with 243 additions and 88 deletions

View File

@ -16,5 +16,5 @@ alias beats_raw='echo "x = (`date +%s` + 3600) % 86400; scale=3; x / 86.4" | bc'
alias beats='printf "@\e[0;36m`beats_raw`\e[m\n"'
alias pp='python -mjson.tool'
alias ttbp='~endorphant/bin/ttbp'
alias vuln='find /home/ \! -type l -perm -o=w 2> /dev/null'
alias vuln='find /home/ \! -type l -perm -o=w ! -iwholename '*.git*' 2> /dev/null'
alias vulnc='vuln | sed "s/\/home\/\([^/]*\)\/.*/\1/g" | sort | uniq -c | sort -nr'

View File

@ -187,7 +187,7 @@ def figlet(channel, text):
lines = subprocess.Popen(["figlet", "-w140"] + text.split(' '), shell=False, stdout=subprocess.PIPE).stdout.read()
for line in lines.split('\n'):
ircsock.send("PRIVMSG " + channel + " :" + line + "\n")
time.sleep(0.3) #to avoid channel throttle due to spamming
time.sleep(0.4) #to avoid channel throttle due to spamming
def toilet(channel, text):
if not text:
@ -196,7 +196,7 @@ def toilet(channel, text):
lines = subprocess.Popen(["toilet", "-w140", "--irc"] + text.split(' '), shell=False, stdout=subprocess.PIPE).stdout.read()
for line in lines.split('\n'):
ircsock.send("PRIVMSG " + channel + " :" + line + "\n")
time.sleep(0.3) #to avoid channel throttle due to spamming
time.sleep(0.4) #to avoid channel throttle due to spamming
def get_acronym(channel, text):
if not text:
@ -223,6 +223,13 @@ def get_whosaid(channel, text):
msg += ' and %s said it %d times' % (result['data'][1][0], result['data'][1][1])
ircsock.send("PRIVMSG " + channel + " :" + msg + ".\n")
def get_notice(user, channel):
ircsock.send("CNOTICE " + user + " " + channel + " :Notice me sempai!\n")
def get_water(user, channel, msg, botnick):
if msg.find(botnick) == 0:
ircsock.send("PRIVMSG " + channel + " :Fight me, " + user + "!\n")
def mug_off(channel):
ircsock.send("PRIVMSG " + channel + " :u want some of this, m8?\n")
@ -317,6 +324,13 @@ def listen(botnick):
if ircmsg.find(":!whosaid") != -1:
get_whosaid(channel, messageText[9:])
if ircmsg.find(":!notice") != -1:
get_notice(user, channel)
if ircmsg.find(":!water") != -1:
get_water(user, channel, messageText[7:], botnick)
if ircmsg.find(":!rollcall") != -1:
rollcall(channel)

View File

@ -40,7 +40,8 @@ and continue asking for word replacement until it runs out of words to replace.
* Allow story writers the ability to specify that a single answer should be used multiple times in a story
* Maybe specified like {{#a noun#}} or {{#a noun#4}}
* Create word-munging options that can be specified for a word to modify given user input
* Capital - convert "foo" to "Foo"
* AllCaps - convert "bar" to "BAR"
* Numeric - convert "3" to "three"
* Ordinal - convert "3" to "third"
* title - convert "foo" to "Foo"
* upper - convert "bar" to "BAR"
* lower - convert "bAz" to "baz"
* numeric - convert "3" to "three"
* ordinal - convert "3" to "third"

View File

@ -1,12 +1,16 @@
#!/usr/bin/python
import collections
import glob
import inflect
import random
import re
p = inflect.engine()
file_pattern = "/home/*/madlibs/*.madlib"
file_regex = re.compile(r'^/home/(.*?)/.*/([^/]*)\.madlib$')
word_regex = re.compile(r'{{(.*?)}}')
word_regex = re.compile(r'{{(.*?)(#.*?)?(\|.*)?}}')
word_replace_regex = re.compile(r'^(.*)#(\d*)$')
# Take a file path and return a tuple with the title and original path
def munge_story(file_name):
@ -25,7 +29,16 @@ def find_stories(limit=999, shuffle=False):
# Count the number of replacable words in the story
def count_words(story):
return len(word_regex.findall(story))
# words that have a '#' part and match should only be counted once
count = 0
repeats = []
for match in re.finditer(word_regex, story):
if match.group(2) is None: #the '#' part
count += 1
elif match.group(1) + match.group(2) not in repeats:
count += 1
repeats.append(match.group(1) + match.group(2))
return count
# Count the number of replacable words in the story when given a file path
def count_words_file(storyPath):
@ -45,10 +58,38 @@ def find_next_word(story, rand=False):
return (match.group(0), match.group(1))
# Replace a word and return the entire story body
# Using a query phrase, replace a word and return the entire story body
def replace_word(story, query, word):
return story.replace(query, word, 1)
#return re.sub(query, word, story, 1)
rquery = word_regex.search(query)
# '{{foo#bar|baz|bang}}' => ('foo', '#bar', '|baz|bang')
pipes = [p.lower() for p in (rquery.group(3) if rquery.group(3) is not None else '').strip('|').split('|')]
munged_word = process_pipes(word, pipes)
story = story.replace(query, munged_word, 1)
if rquery.group(2) is not None: #if there is a '#' part we replace all instances
print "Looking for {{" + rquery.group(1) + rquery.group(2) + ".*?}}"
others = re.findall(r'{{' + rquery.group(1) + rquery.group(2) + '.*?}}', story)
if len(others) > 0:
story = replace_word(story, others[0], word) #iteratively replace the next instance
return story
# Modify user input based on certain modifying pipes
def process_pipes(word, pipes):
for pipe in pipes:
try:
word = {
'upper': lambda word: word.upper(),
'lower': lambda word: word.lower(),
'title': lambda word: word.title(),
'numeric': lambda word: p.number_to_words(word),
'ordinal': lambda word: p.ordinal(word),
collections.defaultdict: lambda word: word
}[pipe](word)
except Exception:
pass # just keep going if an error occurs processing a pipe
return word
# A helper function that will split the story up into chat-printable lengths
def yield_lines(line, max_size):

Binary file not shown.

View File

@ -59,7 +59,7 @@ def resetGlobals(channel=""):
story[channel] = ""
nextword[channel] = {}
def get_stories(channel):
def get_stories(channel, botnick):
global state
global stories
state[channel] = State.thinking
@ -73,11 +73,11 @@ def get_stories(channel):
for idx, story in enumerate(stories[channel]):
sendmsg(channel, "[{}] {} ({} words)".format(idx, story[0], story[2]))
time.sleep(0.5 * THROTTLE_FACTOR)
sendmsg(channel, "Please select a story by index:")
sendmsg(channel, "Please select a story by index by saying '{}: <number>':".format(botnick))
state[channel] = State.story_selection
# Handle user input when the bot is directly addressed
def handle_bot_msg(channel, msg):
def handle_bot_msg(channel, msg, botnick):
global state
global stories
@ -92,9 +92,9 @@ def handle_bot_msg(channel, msg):
if saved_state != State.idle and msg == "!quit":
quit_game(channel)
elif saved_state == State.idle and msg == "startgame":
get_stories(channel)
get_stories(channel, botnick)
elif saved_state == State.story_selection:
handle_story_selection(channel, msg)
handle_story_selection(channel, msg, botnick)
elif saved_state == State.word_input:
handle_story_step(channel, msg)
else:
@ -106,7 +106,7 @@ def quit_game(channel):
sendmsg(channel, "Ok, quitting the current game.")
# Handle user input when we are in story selection mode
def handle_story_selection(channel, msg):
def handle_story_selection(channel, msg, botnick):
global stories
global state
try:
@ -120,19 +120,19 @@ def handle_story_selection(channel, msg):
with open(stories[channel][imsg][1], "r") as storyFile:
story[channel] = storyFile.read()
stories[channel] = {} # Clear out the saved selectable stories in memory
story_start(channel)
story_start(channel, botnick)
except ValueError:
sendmsg(channel, "Invalid selection. Try again!")
state[channel] = State.story_selection
# Handle when a story is being started
def story_start(channel):
def story_start(channel, botnick):
global story
global state
global nextword
state[channel] = State.thinking
sendmsg(channel, "Alright! Let's get started!")
sendmsg(channel, "Alright! Let's get started! Say '{}: <word>' to give me words.".format(botnick))
nextword[channel] = madlib.find_next_word(story[channel], True)
time.sleep(0.5 * THROTTLE_FACTOR)
sendmsg(channel, "Give me {}:".format(nextword[channel][1]))
@ -169,7 +169,7 @@ def finish_story(channel):
sendmsg(channel, '=' * MAX_LINE)
for line in story[channel].splitlines():
for part in madlib.yield_lines(line, MAX_LINE):
time.sleep(0.4 * THROTTLE_FACTOR)
time.sleep(0.6 * THROTTLE_FACTOR)
sendmsg(channel, part)
padlen = (MAX_LINE - 9)/2
mod = (MAX_LINE - 9) % 2
@ -186,10 +186,19 @@ def sendmsg(chan , msg):
ircsock.send("PRIVMSG {} :{}\n".format(chan, msg))
def joinchan(chan):
global state
state[chan] = State.idle
ircsock.send("JOIN {}\n".format(chan))
def rollcall(channel, botnick):
sendmsg(channel, "Do you like MadLibs? Start a collaborative story by saying '{}: startgame'".format(botnick))
global state
if channel not in state:
state[channel] = State.idle
if state[channel] == State.idle:
sendmsg(channel, "Do you like MadLibs? Start a collaborative story by saying '{}: startgame'".format(botnick))
else:
sendmsg(channel, "A game is already in progress. Say '{}: <word>' to provide me with the next word or '{}: !quit' to stop the current game".format(botnick, botnick))
def connect(server, channel, botnick):
ircsock.connect((server, 6667))
@ -222,7 +231,7 @@ def listen(botnick):
rollcall(channel, botnick)
elif message.startswith(botnick) == True:
botmsg = botmsgre.match(message).group(1)
handle_bot_msg(channel, botmsg)
handle_bot_msg(channel, botmsg, botnick)
sys.stdout.flush()
time.sleep(1 * THROTTLE_FACTOR)

View File

@ -11,7 +11,7 @@ fuzz_amount = 3
def make_puzzle(obfuscate=True):
answer = 0
bonus = 0
puzzle = random.choice(["Prove you're not a robot: ", "Are you a robot?: ", "Anti-bot check: ", "Counter-cndorphant measures: ", "Cosnok countermeasures: ", "Anti-tildethief precautions: "])
puzzle = random.choice(["Prove you're not a robot: ", "Are you a robot?: ", "Anti-bot check: ", "Counter-cnd0rphant measures: ", "Cosn0k countermeasures: ", "Anti-tilde7hief precautions: "])
puzzle += random.choice(["What is", "How many is", "What do you get from", "What do you get with", "What is the value of", "Can you answer", "Can you tell me"])
puzzle += " "
roll = random.randrange(0,18)

View File

@ -1,7 +1,7 @@
#!/bin/bash
if [[ ! `pidof -sx madlibbot.py` ]]; then
nohup ./madlibbot/madlibbot.py -s 127.0.0.1 -n madlibbot -c \#madlibs >> madliblog 2>> madliblog &
nohup ./madlibbot/madlibbot.py -s 127.0.0.1 -n madlibbot -c \#bots >> madliblog 2>> madliblog &
echo "Starting madlibbot"
else
echo "madlibbot has already been started"

View File

@ -1,13 +1,13 @@
krowbar&^%2211&^%1528995967
krowbar&^%2354&^%1537371836
karlen&^%498&^%1527613440
endorphant&^%682&^%1444775660
jumblesale&^%24&^%1426171214
marcus&^%2571&^%1528142058
marcus&^%2574&^%1530026564
papa&^%181&^%1474509971
epicmorphism&^%5&^%1421937744
audy&^%83&^%1504564254
kc&^%28&^%1480730333
vilmibm&^%15&^%1520970953
vilmibm&^%17&^%1535654280
cmr&^%2244&^%1485978592
imt&^%519&^%1424087616
cndorphant&^%788&^%1424094192
@ -39,27 +39,27 @@ synergian&^%22&^%1458152889
dheeraj&^%5&^%1456489270
demobot&^%6&^%1454439605
premysl&^%65&^%1461768606
minerobbe&^%268&^%1529052078
xkeeper&^%14&^%1461967961
minerobbe&^%269&^%1530328006
xkeeper&^%199&^%1536855625
cosnok&^%807&^%1508878859
escobar&^%1&^%1475431401
amicabot&^%30&^%1481225205
caff&^%1022&^%1528745010
kadin&^%5&^%1479870008
desvox&^%5&^%1481632697
caff&^%1023&^%1532662853
kadin&^%8&^%1537306549
desvox&^%25&^%1537178981
mankins&^%3&^%1480211581
cinch&^%2&^%1480454755
caffbot&^%968&^%1528745018
caffbot&^%969&^%1532662872
evilbot&^%4&^%1480693919
tybaltcat&^%7&^%1481076625
minerbot&^%146&^%1520382015
mio&^%339&^%1506434277
archangel&^%464&^%1524447604
tehfraga&^%263&^%1527511198
mio&^%347&^%1529720473
archangel&^%476&^%1537304671
tehfraga&^%537&^%1537326808
sushi&^%10&^%1493253212
troido&^%285&^%1529052063
gamebot&^%160&^%1529052049
nilaky&^%1152&^%1529028413
troido&^%287&^%1533042798
gamebot&^%178&^%1533042867
nilaky&^%1339&^%1537312079
bucket&^%103&^%1507931139
lolbot&^%1&^%1502568407
m455&^%12&^%1512076715
@ -72,32 +72,32 @@ pinhook&^%8&^%1509744722
emfor&^%3&^%1509671353
k2l8m11n2&^%11&^%1510932395
sacredpix&^%3&^%1522082931
deltawitc&^%2018&^%1529022699
login&^%1147&^%1529054074
deltawitc&^%3045&^%1537372902
login&^%2076&^%1537359686
kelpiebot&^%3&^%1513101957
unreal&^%1&^%1514940020
tildethie&^%3000&^%1521573658
unreal&^%2&^%1534387108
tildethie&^%5040&^%1537374440
kinsey&^%26&^%1520446672
testgameb&^%2&^%1517405361
erin&^%2&^%1517681999
wuz&^%3&^%1518125300
hashdang&^%4&^%1518666906
ubergeek&^%63&^%1526043601
ubergeek&^%63&^%1530410162
silver&^%9&^%1519333029
equa&^%47&^%1528124305
equa&^%53&^%1534373756
audiodude&^%2&^%1519453927
jumblesal&^%1&^%1519746512
whimsy&^%45&^%1527777458
wangofett&^%100&^%1528482540
whimsy&^%47&^%1529678733
wangofett&^%179&^%1537310239
saturn597&^%3&^%1521429369
cwmccabe&^%2&^%1521598124
lucidiot&^%28&^%1526201925
tracer&^%1&^%1521744878
jan6&^%571&^%1529054825
jan6&^%1052&^%1536870225
jan&^%10&^%1522319160
etathetae&^%3&^%1522937843
eeeeeta&^%31&^%1527704747
cmccabe&^%66&^%1528506935
eeeeeta&^%51&^%1535563434
cmccabe&^%79&^%1529698164
jan6_test&^%7&^%1523252589
jan6_&^%8&^%1523641589
carbon&^%9&^%1524135505
@ -105,13 +105,31 @@ ne1&^%7&^%1524024485
Halian&^%32&^%1528360263
lunasspec&^%4&^%1524164784
bowlercap&^%3&^%1524165068
littlebig&^%36&^%1529000570
severak&^%6&^%1528901245
littlebig&^%46&^%1535927253
severak&^%16&^%1533802439
ralph&^%4&^%1526980620
benjaminw&^%80&^%1529074458
von&^%120&^%1529074049
ensis&^%164&^%1529072988
benjaminw&^%503&^%1537371492
von&^%392&^%1537371528
ensis&^%1507&^%1537370624
simon&^%26&^%1527937489
benharri&^%62&^%1529075403
benharri&^%1397&^%1536689051
cpb&^%3&^%1528930564
calmbit&^%4&^%1529073811
calmbit&^%146&^%1537237248
wisebot&^%4466&^%1537376483
paannd_a&^%2&^%1529617165
nincollin&^%6&^%1531186900
x4464&^%1&^%1532028546
pounce&^%19&^%1532133325
von_&^%5&^%1532502104
livix&^%7&^%1533603142
ben&^%3&^%1533767627
npa&^%78&^%1536235183
ezo&^%6&^%1533883842
aliasless&^%30&^%1537198276
kirch&^%41&^%1535571833
root&^%2&^%1535558514
byte&^%5&^%1536416308
qbe&^%6&^%1537112151
informati&^%3&^%1536733938
h00fi&^%1&^%1537050053
fantoro&^%4&^%1537106482

View File

@ -40,3 +40,8 @@
1522267660&^%jan&^%What is the last film you saw?
1522846620&^%krowbar&^%Have you ever had to wear a uniform to school?
1523121085&^%jan6&^%no topics in the tropic
1534250166&^%krowbar&^%hello world
1534294757&^%deltawitc&^%All hail DeltaWitch the Bot Queen
1534300117&^%unreal&^%All hail DeltaWitch the Bot Queen and Unreal the Bot Monarch
1534300975&^%unreal&^%All hail DeltaWitch the Bot Queen and Unreal, Sovran of Bots
1534301504&^%deltawitc&^%All hail DeltaWitch the Bot Queen, and Unreal, Sovran of Bots

View File

@ -250,3 +250,9 @@
1526577609&^%archangel&^%When you were in grade school, what did you want to be when you grew up? Why?
1526842324&^%vilmibm&^%welcome, wave of new users <3
1528317036&^%vilmibm&^%what are the feels?
1529602271&^%vilmibm&^%welcome to the town! we're glad you're here. | some other channels that you can /join: #projects (discuss cool stuff other townies have made), #bots (experiment or play with bots), #dumpsterfire (talk about heavy shit)
1533541086&^%vilmibm&^%<3
1533794911&^%vilmibm&^%if you'd like to be included in the package of memories we're sending to abraxas's family, please get your posts into the BBJ thread by 2018-08-09 19:00 UTC. <3
1534119128&^%vilmibm&^%<3 | for more about this chat, see https://tilde.town/wiki/irc.html or run `wiki get irc`
1534311634&^%vilmibm&^%welcome! to learn more about this chat, check out https://tilde.town/wiki/irc.html or run `wiki get irc`
1535572794&^%vilmibm&^%weechat has been updated! quit and run `chat` to get the new version if you want | to learn more about this chat, check out https://tilde.town/wiki/irc.html or run `wiki get irc`

View File

@ -1,4 +1 @@
krowbar&^%6&^%2
jan&^%0&^%1vilmibm&^%0&^%1etathetae&^%1&^%0
etathetae&^%0&^%2
jan6&^%0&^%1vilmibm&^%0&^%1vilmibm&^%0&^%1vilmibm&^%0&^%1vilmibm&^%0&^%1vilmibm&^%0&^%1vilmibm&^%0&^%1archangel&^%0&^%1vilmibm&^%0&^%1vilmibm&^%0&^%1
vilmibm&^%0&^%2

View File

@ -197,6 +197,7 @@ there
doing
even
does
doesn
theres
theyve
were

View File

@ -6,7 +6,7 @@ DATE=`date -d yesterday +%b\ %Y`
OUT=/home/krowbar/logs/chatcloud${MONTH}.json
DIR=/home/krowbar/public_html/data
PAGE=/home/krowbar/public_html/chatcloud/index.html
LINE=7
LINE=16
/usr/bin/python /home/krowbar/Code/python/chatcloud2.py -timeend $END -timestart $START -outfile $OUT
ln -s $OUT $DIR

View File

@ -23,7 +23,7 @@ charset="utf-8"></script>-->
d = new Date(0);
d.setUTCSeconds((Number(time) + threeDays) % oneWeek - threeDays);
<!--data.push([user, d.toISOString().slice(11,16), d, d]);-->
data.push([user, d, d]);
data.push([user, d, d]); <!-- User, Start, End, score -->
});
}
});
@ -54,13 +54,17 @@ charset="utf-8"></script>-->
function drawChart() {
var container = document.getElementById('timeline');
console.log('container', container);
var chart = new google.visualization.Timeline(container);
console.log('chart', chart);
var dataTable = new google.visualization.DataTable();
console.log('dataTable', dataTable);
dataTable.addColumn({ type: 'string', id: 'User' });
<!--dataTable.addColumn({ type: 'string', id: 'tooltip' });-->
dataTable.addColumn({ type: 'date', id: 'Start' });
dataTable.addColumn({ type: 'date', id: 'End' });
<!--dataTable.addColumn({ type: 'number', id: 'Score' });-->
dataTable.addRows(data);
chart.draw(dataTable);

View File

@ -24,3 +24,8 @@ PRESENTATION
- See a timeline with colored strands of when they spoke and were mentioned
* Something that looks like the Github commit history
* Use D3 for coolness
TODO
* Add a "sort by" dropdown
- name
- most active

View File

@ -1,9 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<title>Tilde.town Chat Cloud</title>
<style>
body {
background-color: wheat;
}
</style>
</head>
<meta charset="utf-8">
<body>
<div>
<select id="series">
<option value="">Today</option>
<option value="_2018_08">Aug 2018</option>
<option value="_2018_07">Jul 2018</option>
<option value="_2018_06">Jun 2018</option>
<option value="_2018_05">May 2018</option>
<option value="_2018_04">Apr 2018</option>
<option value="_2018_03">Mar 2018</option>
@ -61,6 +73,7 @@
onclick="getWords('/~krowbar/data/chatcloud' + document.getElementById('series').value + '.json',
document.getElementById('howMuch').value)"
>Generate Cloud</button>
<input type="checkbox" id="flat">Flat</input>
</div>
<div id="cloud"></div>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
@ -105,7 +118,7 @@ jQuery.getJSON(source, function(json) {
.size([1200, 800])
.words(jsonWords)
.padding(3)
.rotate(function() { return ~~(Math.random() * 2) * 90; })
.rotate(function() { return ~~(Math.random() * 2) * 90 * !document.getElementById('flat').checked; })
.font("Impact")
.fontSize(function(d) { return Math.sqrt(d.size) * 50 / maxSize + 6; })
.on("end", draw);
@ -136,4 +149,6 @@ draw = function(words) {
}
})();</script>
<a href="https://github.com/RussellChamp/tilde-projects/tree/master/Code/python">(see source)</a>
</body>
</html>

View File

@ -1,6 +1,11 @@
<html>
<head>
<title>Tilder Disk Usage</title>
<style>
body {
background-color: wheat;
}
</style>
</head>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
@ -26,7 +31,8 @@
title: 'Tilder Disk Usage',
subtitle: 'in kb',
pieHole: 0.4,
sliceVisibilityThreshold: 0.005
sliceVisibilityThreshold: 0.005,
backgroundColor: 'wheat'
};
var lineoptions = {
title: 'Tilder Disk Usage',
@ -34,7 +40,8 @@
vAxis: {
0: {title: 'kb'},
logScale: true
}
},
backgroundColor: 'wheat'
};
jQuery.getJSON("/~krowbar/data/du_log.json", function(json) {
@ -116,4 +123,7 @@
<div id="donutchart" style="width: 700px; height: 400px;"></div>
<input id="onlyInteresting" type="checkbox" onClick="drawCharts()">Only Interesting Data</input>
<div id="linechart" style="width: 120%; height: 130%; margin-left: -10%"></div>
<div>
<a href="https://github.com/RussellChamp/tilde-projects/tree/master/Code/bash">(see source)</a>
</div>
</body>

View File

@ -1,28 +1,52 @@
<html>
<head>
<title>~krowbar's home page</title>
<title>~krowbar's home page</title>
<style>
body {
background-color: #f7a716a6;
}
g {
background-color: white;
}
</style>
</head>
<body>
Links and stuff
<ul>
<li><a href="mc/">Minecraft</a></li>
<li><a href="chatchecker/">Tilde.town IRC Chat checker</a></li>
<li><a href="chatstats/">IRC User Chat Statistics</a></li>
<li><a href="besties/">IRC Chat Bestie Nodes</a></li>
<li><a href="circle/">IRC Chat Bestie Circle</a></li>
<li><a href="twine2/">Twine 2.0</a></li>
<li><a href="grimoire/app/">Grimoire: The Pathfinder Item Roller</a></li>
<li><a href="https://github.com/RussellChamp/PragmaticDiceBag">Pragmatic Dice Bag: Artsy fartsy guide!</a></li>
<li><a href="limericks/">Dumb Limericks</a></li>
<li><a href="rainycoffee/">Rainy Mood + Dark Coffee</a></li>
</ul>
<h1>~krowbar's home page</h1>
<h2>Links and stuff</h2>
<div>
<ul>
<li><a href="mc/">Minecraft</a></li>
<li><a href="chatchecker/">Tilde.town IRC Chat checker</a></li>
<li><a href="chatstats/">IRC User Chat Statistics</a></li>
<li><a href="besties/">IRC Chat Bestie Nodes</a></li>
<li><a href="circle/">IRC Chat Bestie Circle</a></li>
<li><a href="twine2/">Twine 2.0</a></li>
<li><a href="grimoire/app/">Grimoire: The Pathfinder Item Roller</a></li>
<li><a href="https://github.com/RussellChamp/PragmaticDiceBag">Pragmatic Dice Bag: Artsy fartsy guide!</a></li>
<li><a href="limericks/">Dumb Limericks</a></li>
<li><a href="rainycoffee/">Rainy Mood + Dark Coffee</a></li>
</ul>
</div>
<h2><a href="chatcloud/">Tilde.town IRC Chat cloud</a></h2>
<iframe width=1200 height=800 frameborder=0 scrolling="no" src="chatcloud/"></iframe>
<h2><a href="chatcloud/">Tilde.town IRC Chat cloud</a></h2>
<iframe width=1200 height=900 frameborder=0 scrolling="no" src="chatcloud/"></iframe>
<h2><a href="mission/">Mission name generator</a></h2>
<iframe width=1200 height=200 frameborder=0 scrolling="no" src="mission/"></iframe>
<h2><a href="mission/">Mission name generator</a></h2>
<iframe width=1200 height=100 frameborder=0 scrolling="no" src="mission/"></iframe>
<h2><a href="du/">Tilde.town disk usage</a></h2>
<iframe width=1200 height=1200 frameborder=0 scrolling="no" src="du/"></iframe>
<h2><a href="du/">Tilde.town disk usage</a></h2>
<iframe width=1200 height=1200 frameborder=0 scrolling="no" src="du/"></iframe>
<h2>A poem on build infrastructure</h2>
<div>
<pre>
The bi-weekly march to prod /
It has 10,000 steps /
We spin up servers with daily build jobs then we knock them down again!
And sometimes CI's up /
And sometimes DEMO's down /
But when they're only half-way up they're neither up nor down!
</pre>
</div>
</body>

View File

@ -1,6 +1,11 @@
<html>
<head>
<title>Secret Mission Name Generator</title>
<style>
body {
background-color: wheat;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
<script src="./js/lodash.js"></script>
<script src="./js/mission.js"></script>