quasseldump/qd

105 lines
2.3 KiB
Fish
Executable File

#!/usr/bin/fish
set db /var/lib/quassel/quassel-storage.sqlite
argparse --name=quasseldump "s=" "l#" "b=" "n=" "t" "j" "c" "h" "d=" "f=" -- $argv
if test -z "$_flag_l"
set -g limit 20
else
set -g limit "$_flag_l"
end
if test "$_flag_h"
echo "-s text search
-b select buffer
-l set limit
-n filter nicks
-t show time
-c show channel
-j show join/part
-d custom date format
-f time range (date|date)"
exit
end
set wanted_types 1
if test -n "$_flag_j"
set -a wanted_types 32 128
end
set types (string join "," $wanted_types)
set query_start "select * from (select backlog.type, backlog.time, buffer.buffername, sender.sender, backlog.message from backlog natural join sender natural join buffer where type in ($types) "
set query_search "and message like \"%$_flag_s%\" "
set query_nick "and sender.sender like \"$_flag_n!%\" "
set query_end "order by backlog.time desc limit $limit ) order by time asc;"
set -a query_string $query_start
if test -n "$_flag_b"
set buffer_id ( sqlite3 $db "select bufferid from buffer where buffername=\"$_flag_b\" " )
set query_chan "and bufferid = \"$buffer_id\" "
set -a query_string $query_chan
end
function to_milis -a datestring
math -- (date -d "$datestring" "+%s" ) x 1000
end
if test -n "$_flag_f"
set datesplit (string split "|" "$_flag_f")
if test -n "$datesplit[2]"
set s_time (to_milis "$datesplit[1]")
set e_time (to_milis "$datesplit[2]")
set query_date "and backlog.time between $s_time and $e_time "
set -a query_string $query_date
else
echo "must specify range"
exit
end
end
if test -n "$_flag_s"
set -a query_string $query_search
end
if test -n "$_flag_n"
set -a query_string $query_nick
end
set -a query_string $query_end
function query
sqlite3 $db "$query_string"
end
while read line
set split (string split -m5 "|" $line)
set nick (string split -m1 "!" $split[4])[1]
set seconds (math ceil -- $split[2] / 1000)
set date_format "%y-%m-%d %R"
if test "$_flag_d"
set date_format "$_flag_d"
end
set time ( date -d "@$seconds" "+$date_format" )
if test "$_flag_c"
printf "%s " "$split[3]"
end
if test "$_flag_t"
printf "%s " "$time"
end
switch "$split[1]"
case "32"
printf "→ %s\n" "$nick"
case "1"
printf "<%s> %s\n" "$nick" "$split[5]"
case "128"
printf "← %s\n" "$nick"
end
end < (query | psub)