Compare commits
5 Commits
87d5a542a5
...
cb2d5aa868
Author | SHA1 | Date |
---|---|---|
Stef Dunlap | cb2d5aa868 | |
Stef Dunlap | fb94656f49 | |
Stef Dunlap | e6d32c5cab | |
Stef Dunlap | 47425fdd85 | |
Stef Dunlap | 3ffba8f981 |
|
@ -0,0 +1,3 @@
|
||||||
|
export OUR_NICK=your
|
||||||
|
export OUR_CHANNELS='#bots'
|
||||||
|
export OUR_CMDS_DIR=/town/our
|
Binary file not shown.
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo -n "\$1 => " ; test -z "$1" && echo -n "<empty> | " || echo -n "$1 | "
|
||||||
|
echo -n "\$2 => " ; test -z "$2" && echo -n "<empty> | " || echo -n "$2 | "
|
||||||
|
echo -n "\$3 => " ; test -z "$3" && echo -n "<empty> | " || echo -n "$3 | "
|
||||||
|
echo -n "\$4 => " ; test -z "$4" && echo -n "<empty> | " || echo -n "$4 | "
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
DIR=$(dirname -- $0)
|
||||||
|
DATA="$DIR/data/count"
|
||||||
|
|
||||||
|
old_number=$(cat "$DATA")
|
||||||
|
new_number=$((old_number + 1))
|
||||||
|
echo $new_number > $DATA
|
||||||
|
echo $new_number
|
|
@ -0,0 +1,2 @@
|
||||||
|
*
|
||||||
|
!.gitignore
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import random
|
||||||
|
from io import StringIO
|
||||||
|
|
||||||
|
base = 0x1f345
|
||||||
|
nSides = 14
|
||||||
|
rounds = 14
|
||||||
|
fp = StringIO()
|
||||||
|
|
||||||
|
for i in range(rounds):
|
||||||
|
roll = random.randint(0, nSides)
|
||||||
|
chcr = base + roll
|
||||||
|
fp.write(chr(chcr))
|
||||||
|
|
||||||
|
print(fp.getvalue())
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
echo hi $2 from $3
|
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import sys
|
||||||
|
if len(sys.argv) > 1 and sys.argv[1] == "writing":
|
||||||
|
print("you can add new scripts to our by placing executable files in the /town/our directory. Make sure they have the +x permission. programs are passed these arguments by the bot: the arguments given in the message (our/[program] [args]), the user ID, and the channel it was run from.")
|
||||||
|
else:
|
||||||
|
print("the our bot allows smol programs written by townies to be used by typing \"our/[program]\" from IRC. See also \"our/help writing\"")
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
echo "You're doing great."
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/usr/bin/env hy3
|
||||||
|
|
||||||
|
(import [datetime [datetime]])
|
||||||
|
|
||||||
|
(setv fullwidth (str.maketrans
|
||||||
|
(dfor [i ch] (enumerate "0123456789") [(str i) ch])))
|
||||||
|
|
||||||
|
(setv weekdays "日月火水木金土") (comment 曜日)
|
||||||
|
|
||||||
|
(defn ctime []
|
||||||
|
(setv d (datetime.now))
|
||||||
|
(-> (.format "{}年{}月{}日 {:02d}:{:02d}:{:02d}"
|
||||||
|
d.year d.month d.day d.hour d.minute d.second)
|
||||||
|
(.translate fullwidth)))
|
||||||
|
|
||||||
|
(print (ctime))
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
DIR=$(dirname -- $0)
|
||||||
|
find $DIR/* -maxdepth 1 -perm -111 -type f -printf "%f "
|
||||||
|
echo
|
|
@ -0,0 +1,35 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# A simple dice rolling app
|
||||||
|
# Written by xaphania 2022-04-19
|
||||||
|
# v0.1.our
|
||||||
|
# modified for use with the our irc bot 2022-04-21
|
||||||
|
# yes this probably sucks. please send your flames to xaphania@tilde.town
|
||||||
|
|
||||||
|
import random
|
||||||
|
import sys
|
||||||
|
|
||||||
|
try:
|
||||||
|
dstring = sys.argv[1]
|
||||||
|
except:
|
||||||
|
dstring = "1d6"
|
||||||
|
|
||||||
|
try:
|
||||||
|
numDice = int(dstring.split("d",1)[0])
|
||||||
|
numFace = int(dstring.split("d",1)[1])
|
||||||
|
except:
|
||||||
|
print(f"{dstring} is not a valid dice format")
|
||||||
|
exit()
|
||||||
|
|
||||||
|
diceList=[]
|
||||||
|
|
||||||
|
while numDice>0:
|
||||||
|
diceList.append(random.randint(1,numFace))
|
||||||
|
numDice-=1
|
||||||
|
|
||||||
|
total = sum(diceList)
|
||||||
|
avg = total / len(diceList)
|
||||||
|
high = max(diceList)
|
||||||
|
low = min(diceList)
|
||||||
|
|
||||||
|
print (f"Result: {diceList} | Total: {total} Average: {avg} Highest: {high} Lowest: {low}")
|
|
@ -0,0 +1,89 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func randStr(s []string) string {
|
||||||
|
return s[rand.Intn(len(s))]
|
||||||
|
}
|
||||||
|
|
||||||
|
func airQuality() string {
|
||||||
|
return randStr([]string{
|
||||||
|
"moist",
|
||||||
|
"warm",
|
||||||
|
"humid",
|
||||||
|
"cool",
|
||||||
|
"dry",
|
||||||
|
"electric",
|
||||||
|
"dusty",
|
||||||
|
"hazy",
|
||||||
|
"smoky",
|
||||||
|
"clear",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func wallType() string {
|
||||||
|
return randStr([]string{
|
||||||
|
"bronze",
|
||||||
|
"mossy stone",
|
||||||
|
"wet stone",
|
||||||
|
"copper",
|
||||||
|
"tile",
|
||||||
|
"hard wood",
|
||||||
|
"stained wood",
|
||||||
|
"purple",
|
||||||
|
"light blue",
|
||||||
|
"yellowed",
|
||||||
|
"vine choked",
|
||||||
|
"art hung",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func lightQuality() string {
|
||||||
|
return randStr([]string{
|
||||||
|
"dimly lit",
|
||||||
|
"brightly lit",
|
||||||
|
"faintly lit",
|
||||||
|
"covered in dancing shadows",
|
||||||
|
"dappled",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func lightSource() string {
|
||||||
|
return randStr([]string{
|
||||||
|
"candle light",
|
||||||
|
"bioluminescent moss",
|
||||||
|
"bioluminescent fungus",
|
||||||
|
"lantern light",
|
||||||
|
"flickering monitors",
|
||||||
|
"a cracked LCD",
|
||||||
|
"a fireplace",
|
||||||
|
"a torch",
|
||||||
|
"sconces",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func aroma() string {
|
||||||
|
return randStr([]string{
|
||||||
|
"lavender",
|
||||||
|
"cloves",
|
||||||
|
"sulphur",
|
||||||
|
"baking cookies",
|
||||||
|
"dirt",
|
||||||
|
"wet soil",
|
||||||
|
"cut grass",
|
||||||
|
"wet dog",
|
||||||
|
"cinnamon",
|
||||||
|
"swamp",
|
||||||
|
"moss",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
rand.Seed(time.Now().UTC().UnixNano())
|
||||||
|
fmt.Printf("the air is %s. %s walls are %s by %s. it smells faintly of %s.\n",
|
||||||
|
airQuality(), wallType(), lightQuality(), lightSource(), aroma())
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/sh
|
||||||
|
echo "$1"|rot13
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#echo "arguments are 1:$1 2:$2 3:$3 4:$4"
|
||||||
|
args="$1";
|
||||||
|
user="$2";
|
||||||
|
channel="$3";
|
||||||
|
nick="$(echo "$user"|cut -d "!" -f 1)"
|
||||||
|
args_lower="$(echo "$args"|tr [:upper:] [:lower:])"
|
||||||
|
case "$args_lower" in
|
||||||
|
("to shine") echo "yo, $nick, 🌟💎shine bright like a diamond!💎🌟";;
|
||||||
|
esac
|
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
echo $2
|
||||||
|
|
||||||
|
ip=$(finger $1 | egrep -o -m 1 '([0-9]{1,3}\.){3}[0-9]{1,3}')
|
||||||
|
tz=$(curl -s "https://ipapi.co/$ip/timezone")
|
||||||
|
TZ=$tz date -R
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/bash
|
||||||
|
user="$2"
|
||||||
|
nick="$(echo "$user"|cut -d "!" -f 1)"
|
||||||
|
/home/jmjl/bin/tw -u $nick $1 | sed -z 's/\n/ - /g'
|
||||||
|
# /home/jmjl/bin/tw -u $nick $1
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
uptime
|
|
@ -0,0 +1,61 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
######################################################
|
||||||
|
# Takes a location, e.g. "New York" as an argument #
|
||||||
|
# and returns the current weather conditions. Uses #
|
||||||
|
# the weather data API courtesy of metaweather.com #
|
||||||
|
######################################################
|
||||||
|
|
||||||
|
######################################################
|
||||||
|
# Written by ~xaphania 2022-04-22 #
|
||||||
|
# For use on tilde.town with the 'our' IRC bot #
|
||||||
|
# Please send comments or suggestions via town mail #
|
||||||
|
# to xaphania@tilde.town #
|
||||||
|
# v0.1 #
|
||||||
|
# TO DO - customise weather strings, add emoji? #
|
||||||
|
# TO DO - more features: detailed reports, future #
|
||||||
|
# and past weather conditions, etc #
|
||||||
|
######################################################
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
|
# get argument, replace spaces with %20
|
||||||
|
search = sys.argv[1].replace(" ","%20")
|
||||||
|
|
||||||
|
# Get Where on Earth ID for specified location
|
||||||
|
searchUrl = "https://www.metaweather.com/api/location/search/?query=" + search
|
||||||
|
|
||||||
|
try:
|
||||||
|
locationData = json.loads(urllib.request.urlopen(searchUrl).read())
|
||||||
|
except:
|
||||||
|
print("Couldn't contact metaweather. Service may be down, please try later.")
|
||||||
|
exit()
|
||||||
|
try:
|
||||||
|
locationID = locationData[0]["woeid"]
|
||||||
|
except:
|
||||||
|
search = search.replace("%20"," ")
|
||||||
|
print(f"Sorry, I couldn't find location {search}")
|
||||||
|
exit()
|
||||||
|
|
||||||
|
# Get weather data for that woeid
|
||||||
|
weatherUrl = "https://www.metaweather.com/api/location/"+str(locationID)+"/"
|
||||||
|
|
||||||
|
try:
|
||||||
|
weatherData = json.loads(urllib.request.urlopen(weatherUrl).read())
|
||||||
|
except:
|
||||||
|
print("Couldn't contact metaweather. Service may be down, please try later.")
|
||||||
|
exit()
|
||||||
|
|
||||||
|
try:
|
||||||
|
state = weatherData["consolidated_weather"][0]["weather_state_name"]
|
||||||
|
temp = round(weatherData["consolidated_weather"][0]["the_temp"])
|
||||||
|
location = weatherData["title"]
|
||||||
|
parent = weatherData["parent"]["title"]
|
||||||
|
print(f"In {location}, {parent} it's {temp}°c and {state}" \
|
||||||
|
+" (Weather Data from www.metaweather.com)")
|
||||||
|
|
||||||
|
except:
|
||||||
|
print("Sorry, there was an error retreiving weather data. Please try later.")
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
echo "A human (most likely)"
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
date
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
echo $3
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
echo $2
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
echo "https://en.wikipedia.org/wiki/Meaning_of_life"
|
|
@ -0,0 +1,18 @@
|
||||||
|
[Unit]
|
||||||
|
Description=our
|
||||||
|
After=our.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/home/kindrobot/wrk/our
|
||||||
|
ExecStart=/home/kindrobot/wrk/our/our.rb
|
||||||
|
Environment="OUR_NICK=your"
|
||||||
|
Environment="OUR_CHANNELS=#bots"
|
||||||
|
Environment="OUR_CMDS_DIR=/town/our"
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
StartLimitInterval=60s
|
||||||
|
StartLimitBurst=3
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
|
@ -0,0 +1,111 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
require 'open3'
|
||||||
|
require 'socket'
|
||||||
|
require 'timeout'
|
||||||
|
|
||||||
|
# configurable environment variables
|
||||||
|
nick = ENV['OUR_NICK'] || 'our'
|
||||||
|
channels = ENV['OUR_CHANNELS'] || '#tildetown,#bots'
|
||||||
|
prefix = ENV['OUR_PREFIX'] || "#{nick}/"
|
||||||
|
cmds_dir = ENV['OUR_CMDS_DIR'] || '/town/our'
|
||||||
|
|
||||||
|
module IRC
|
||||||
|
|
||||||
|
class User
|
||||||
|
attr_accessor :s
|
||||||
|
|
||||||
|
def initialize addr, port, nick
|
||||||
|
@hooks = []
|
||||||
|
|
||||||
|
@s = TCPSocket.open addr, port.to_s
|
||||||
|
s.puts "USER #{nick} fakehost whatevenisaservername :beep boop"
|
||||||
|
s.puts "NICK #{nick}"
|
||||||
|
|
||||||
|
hook do |m|
|
||||||
|
next unless m.cmd == 'PING'
|
||||||
|
raw "PING #{nick}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def raw msg
|
||||||
|
@s.puts msg
|
||||||
|
end
|
||||||
|
|
||||||
|
def join chan
|
||||||
|
raw "JOIN #{chan}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def privmsg target, msg
|
||||||
|
raw "PRIVMSG #{target} :#{msg}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def hook &h
|
||||||
|
@hooks << h
|
||||||
|
end
|
||||||
|
|
||||||
|
def loop
|
||||||
|
while line = s.gets
|
||||||
|
msg = Message.new line
|
||||||
|
@hooks.each{|h| h.call(msg)}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Message
|
||||||
|
attr_accessor :prefix, :cmd, :args, :raw
|
||||||
|
# TODO custom constructor
|
||||||
|
def initialize msg
|
||||||
|
msg = msg.delete_suffix "\r\n"
|
||||||
|
@raw = msg
|
||||||
|
@prefix = nil
|
||||||
|
@prefix, msg = msg[1..].split(' ', 2) if msg[0] == ':'
|
||||||
|
@cmd, msg = msg.split(' ', 2)
|
||||||
|
|
||||||
|
@args = []
|
||||||
|
while msg and not msg.empty?
|
||||||
|
if msg[0] == ':'
|
||||||
|
@args << msg[1..]
|
||||||
|
break
|
||||||
|
end
|
||||||
|
s, msg = msg.split(' ', 2)
|
||||||
|
@args << s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
puts "starting"
|
||||||
|
i = IRC::User.new 'localhost', 6667, nick
|
||||||
|
channels.split(',').each { |channel| i.join channel }
|
||||||
|
i.hook do |msg|
|
||||||
|
next unless msg.cmd == 'PRIVMSG'
|
||||||
|
target, content = msg.args
|
||||||
|
next unless content.delete_prefix! prefix
|
||||||
|
cmd, args = content.split(' ', 2)
|
||||||
|
cmd = "#{cmds_dir}/#{cmd}"
|
||||||
|
args ||= ''
|
||||||
|
next unless File.exists? cmd
|
||||||
|
if not File.executable? cmd
|
||||||
|
i.privmsg target, "#{cmd} isn't executable. try chmod +x"
|
||||||
|
next
|
||||||
|
end
|
||||||
|
begin
|
||||||
|
Open3.popen2e("#{__dir__}/wrap_it.sh", cmd, args, msg.prefix, target) do |_, stdout, wait_thread|
|
||||||
|
out = nil
|
||||||
|
Timeout::timeout(3) do
|
||||||
|
out = stdout.gets # only interested in the first line of output
|
||||||
|
stdout.gets until stdout.eof? # make sure process finishes in time allotted
|
||||||
|
end
|
||||||
|
i.privmsg target, out if out
|
||||||
|
rescue Timeout::Error
|
||||||
|
Process.kill("KILL", wait_thread.pid)
|
||||||
|
i.privmsg target, "[our.rb] command timed out"
|
||||||
|
end
|
||||||
|
rescue Exception => e
|
||||||
|
i.privmsg target, "[our.rb] #{e.to_s}"
|
||||||
|
end
|
||||||
|
next true
|
||||||
|
end
|
||||||
|
i.loop
|
|
@ -0,0 +1,2 @@
|
||||||
|
root:x:0:0:root:/root:/bin/ed
|
||||||
|
weed:x:420:666:lmao:/weed:/bin/mount.ext4
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
DIR=$(dirname -- $0)
|
||||||
|
OUR_CMDS_DIR=${OUR_CMDS_DIR:-/town/our}
|
||||||
|
|
||||||
|
/usr/bin/bwrap \
|
||||||
|
--unshare-all \
|
||||||
|
--ro-bind / / \
|
||||||
|
--bind "$OUR_CMDS_DIR/data" "$OUR_CMDS_DIR/data" \
|
||||||
|
--share-net \
|
||||||
|
--dev /dev \
|
||||||
|
--tmpfs /tmp \
|
||||||
|
--unshare-pid \
|
||||||
|
--die-with-parent \
|
||||||
|
"$@"
|
Loading…
Reference in New Issue