Compare commits

..

20 Commits

Author SHA1 Message Date
Stefan Hagen
af4c0c5040 support old time format 2023-12-24 15:17:31 +01:00
Stefan Hagen
5fc4633a80 add pipes and reverse M:H 2023-12-24 15:14:41 +01:00
Stefan Hagen
f4c5a2a432 remove spurious t 2023-12-24 15:09:32 +01:00
c0dev0id
477d1245f6 !seen, parse timestamp 2023-12-24 15:08:09 +01:00
c0dev0id
b5cc10a0cc change weather api 2023-12-24 11:11:13 +01:00
Stefan Hagen
6a0ee2ac53 connect via TLS 2023-12-24 09:37:22 +01:00
c0dev0id
42106d11a6 Hack von sur5r damit das karma handlung bei SPF+-Slots nicht anspringt. 2023-02-27 16:03:05 +01:00
c0dev0id
73223ca737 Prevent another type of possible loop 2023-02-05 14:58:25 +01:00
fe41bdc363 modify the template used to set the topic to use the wording from the web page (#1)
Co-authored-by: eeemsi <eeemsi+git-uugrn@gmail.com>
Reviewed-on: #1
Co-authored-by: eeemsi <eeemsi@noreply.git.uugrn.org>
Co-committed-by: eeemsi <eeemsi@noreply.git.uugrn.org>
2023-02-05 14:54:45 +01:00
c0dev0id
c1731d0c5d Make the bot work with a new ii versions 2023-02-05 10:09:45 +01:00
c0dev0id
c7a3c4a7c0 Not every fgrep needs to print the result 2023-02-05 09:57:29 +01:00
c0dev0id
e2a8362097 Expansion doesn't work in quotes 2023-02-05 09:55:33 +01:00
c0dev0id
8d57f4e857 This kill was never reached anyway 2023-02-05 09:42:59 +01:00
c0dev0id
1f28b4f79e Add comments 2023-02-05 09:41:32 +01:00
c0dev0id
70f75f82b5 Trapkill not required, ii is closed when the hosting shell is closed (not sure why, though) 2023-02-05 09:33:12 +01:00
c0dev0id
b050adbc02 Comment where things start 2023-02-05 09:30:23 +01:00
c0dev0id
321dc3654b short form 'if' is less cluttered and better readable, often. 2023-02-05 09:29:20 +01:00
c0dev0id
3ea8a8817b Remove unused function reply() 2023-02-05 09:22:36 +01:00
c0dev0id
8ad5751715 Remove redundant mkdir, they're all created on startup 2023-02-05 09:21:44 +01:00
c0dev0id
57872194e5 change bot name and put it into a test channel 2023-02-05 09:20:05 +01:00

162
start.sh
View File

@@ -1,12 +1,8 @@
#!/bin/sh
trap cleanup 1 2 3 6 9 11
cleanup() { kill $PID; }
BOTNICK="uugbot"
SERVER="irc.uugrn.org"
PORT="6660"
PORT="6670"
CHANNEL="#uugrn"
BOTDIR="$PWD"
@@ -14,17 +10,16 @@ BOTDIR="$PWD"
IRCIN="$BOTDIR/irc/$SERVER/$CHANNEL/in"
IRCOUT="$BOTDIR/irc/$SERVER/$CHANNEL/out"
###
### FUNCTIONS ###
###
# $1 message
say() {
echo "out> $1"
echo "$1" > $IRCIN
sleep 1
}
# $1 message
reply() {
echo "out> $1: $2"
echo "$NICK: $2" > $IRCIN
}
settopic() {
curl -s "https://vorstand.uugrn.org/Kalender/Termine.rem" \
@@ -46,7 +41,7 @@ settopic() {
| cut -d"|" -f1 \
| sed 's/ $//g')
say "/topic $CHANNEL :Willkommen bei der UUGRN | Nächstes event: $text am $date um $time Uhr."
say "/topic $CHANNEL :Willkommen bei der UUGRN | Nächste Veranstaltung: $text am $date um $time Uhr."
done
}
@@ -77,7 +72,7 @@ kalender() {
| cut -d" " -f 3- \
| cut -d"|" -f 2-)
if echo "$line" | fgrep ' |'
if echo "$line" | fgrep -q ' |'
then
say "Am $date um $time Uhr findet \"$text\" im \"$loc\" statt."
else
@@ -89,7 +84,6 @@ kalender() {
# $1 nick
# $2 -1 decrease, +1 increase
savekarma() {
mkdir -p $BOTDIR/karma
[ ! -f "$BOTDIR/karma/$1" ] \
&& echo 0 > "$BOTDIR/karma/$1"
@@ -101,28 +95,20 @@ savekarma() {
# $1 nick
reportkarma() {
if [ -z "$1" ]
then
n=$NICK
else
n=$1
fi
[ -z "$n" ] \
&& n=$NICK
if [ ! -f "$BOTDIR/karma/$n" ]
then
if [ "$n" == "$NICK" ]
then
say "Du hast bisher leider noch keine Gummipunkte gesammelt, $n."
else
say "$n hat leider noch keine Gummipunkte gesammelt."
fi
[ "$n" == "$NICK" ] \
&& say "Du hast bisher leider noch keine Gummipunkte gesammelt, $n." \
|| say "$n hat leider noch keine Gummipunkte gesammelt."
else
cur=$(cat "$BOTDIR/karma/$n")
if [ "$n" == "$NICK" ]
then
say "Du hast momentan $cur Gummipunkt(e), $n."
else
say "$n hat momentan $cur Gummipunkt(e)."
fi
[ "$n" == "$NICK" ] \
&& say "Du hast momentan $cur Gummipunkt(e), $n." \
|| say "$n hat momentan $cur Gummipunkt(e)."
fi
}
@@ -131,24 +117,20 @@ karma() {
n="$(echo "$1" | tr -d "+-")"
[ -z "$n" ] && return
if [ "$n" == "$(echo "$NICK" | tr '[:upper:]' '[:lower:]' )" ]
then
say "So aber nicht mein lieber $NICK!"
return
fi
[ "$n" == "$(echo "$NICK" | tr '[:upper:]' '[:lower:]' )" ] \
&& say "So aber nicht mein lieber $NICK!" && return
echo "$1" | fgrep "++" \
echo "$1" | fgrep -q -- "++" \
&& savekarma $n "+1"
echo "$1" | fgrep -- "--" \
echo "$1" | fgrep -q -- "--" \
&& savekarma $n "-1"
echo "$1" | fgrep "+-" \
echo "$1" | fgrep -q -- "+-" \
&& say "Echt jetzt, $NICK?"
echo "$1" | fgrep -- "-+" \
echo "$1" | fgrep -q -- "-+" \
&& say "Echt jetzt, $NICK?"
}
transparenzbericht() {
mkdir -p "$BOTDIR/karma"
cd $BOTDIR/karma || return
cd $BOTDIR/karma
say "Gummipunkte Transparenzbericht:"
for i in $(ls)
do
@@ -160,7 +142,16 @@ seen() {
[ -z "$1" ] && return
if [ -f "$BOTDIR/seen/$1" ]
then
say "$(cat "$BOTDIR/seen/$1")"
_l="$(cat "$BOTDIR/seen/$1")"
_ts="$(echo "$_l" | cut -d" " -f1)"
_msg="$(echo "$_l" | cut -d" " -f2-)"
_dt="$(date -r "$_ts" +"%Y-%m-%d %H:%M")"
if [ -z $_dt ]
then
say "$_l"
else
say "$_dt: $_msg"
fi
else
say "Hmm, ich habe keine Ahnung wann $1 zum letzten mal online war."
fi
@@ -181,60 +172,106 @@ usage() {
# $1 loc
weather() {
if [ -z "$1" ]
then
l=heidelberg
else
l=$1
fi
say "$(curl -s "https://wttr.in/$l?lang=de&format=%l:+%t+%C+%w+%h+Regen")"
param=$1
[ -z $param ] \
&& param=Heidelberg,DE
echo "$param" | fgrep -q "," \
|| param="$param,DE"
DATA=$(curl -s "https://api.openweathermap.org/data/2.5/weather?q=$param&lang=de&units=metric&appid=a4c6e6d6beba2ff733ed81b7e2cac530")
#DATA=$(cat test.json)
RESPONSE=$(echo "$DATA" \
| jq -rc '.name,[.main.temp, .weather[].description][], .main.humidity, .wind.speed' 2> /dev/null \
| awk ' \
NR == 1 { printf("Wetter in %s: ", $0) } \
NR == 2 { printf("%.0d°C, ", $0) } \
NR == 3 { printf("%s", $0) } \
NR == 4 { printf(" (%d%%), ", $0) } \
NR == 5 { printf("Wind: %.0dkm/h", $0) } \
')
case "$RESPONSE" in
*null:*) RESPONSE="$param konnte nicht gefunden werden. Usage: !wetter <stadt>[,<länderkürzel>]"
esac
say "$RESPONSE"
}
###
### MAIN PROGRAM ###
###
mkdir -p "$BOTDIR/irc"
mkdir -p "$BOTDIR/seen"
mkdir -p "$BOTDIR/karma"
cd "$BOTDIR"
# Connect ii and join channel. Afterwards $IRCIN and $IRCOUT are
# available
echo "connecting."
ii -i $BOTDIR/irc -s $SERVER -p $PORT -n $BOTNICK &
ii -i $BOTDIR/irc -s $SERVER -t -p $PORT -n $BOTNICK &
PID=$!
sleep 1
# wait until the background process is ready
sleep 6
echo "/join $CHANNEL" > $BOTDIR/irc/$SERVER/in
sleep 1
echo "ready."
# Listen on $IRCOUT, parse input and call functions once something
# of interest gets posted.
tail -n 0 -f "$IRCOUT" \
| while read -r line
do
NICK=$(echo "$line" \
| sed -n 's/^....-..-.. ..:.. <\([^>]*\).*/\1/p')
if [ "$NICK" == "$BOTNICK" ]
if [ -z "$NICK" ]
then
# prevent loops
continue
# the newer ii is using unix timestamps
NICK=$(echo "$line" \
| sed -n 's/^[0-9]* <\([^>]*\).*/\1/p')
fi
# prevent loops; so the bot can't trigger itself.
[ "$NICK" == "$BOTNICK" ] \
&& continue
# if we still have no nick here, we better stop to prevent excuting
# events from non-users (actions, IRC events etc...)
[ -z "$NICK" ] \
&& continue
COMMAND=$(echo "$line" \
| tr '[:upper:]' '[:lower:]' \
| sed -n 's|.*\(![a-z]*\).*|\1|p')
# intentionally limiting the argument to one and also limit the
# character set for safety reasons.
ARG=$(echo "$line" \
| tr '[:upper:]' '[:lower:]' \
| sed -n 's|.*![a-z]* \([a-zA-Z0-9\-_+]*\).*|\1|p')
| sed -n 's|.*![a-z]* \([a-zA-Z0-9,\-_+]*\).*|\1|p')
# We call it gummipunkte now.
KARMA=$(echo "$line" \
| tr '[:upper:]' '[:lower:]' \
| sed -n 's|.* \([a-zA-Z0-9\-_]*[+-][+-]\).*|\1|p')
| sed -n 's|.* \([a-zA-Z0-9\-_]*[+-][+-]\)$|\1|p;s|.* \([a-zA-Z0-9\-_]*[+-][+-]\) .*|\1|p')
echo "in> $line"
echo "in> NICK=$NICK, COMMAND=$COMMAND, ARG=$ARG, KARMA=$KARMA"
if [ ! -z "$NICK" ]
then
echo "$line" > "$BOTDIR/seen/$NICK"
fi
# we just save the line and replay it on the !seen command
[ ! -z "$NICK" ] \
&& echo "$line" > "$BOTDIR/seen/$NICK"
case "$COMMAND" in
"!kalender") kalender $ARG; ;;
@@ -245,9 +282,8 @@ do
"!settopic") settopic; ;;
"!seen") seen $ARG; ;;
esac
case "$KARMA" in
*[+-][+-]) karma $KARMA; ;;
esac
done
kill $PID