]> git.plutz.net Git - httpchat/blobdiff - channel.sh
split up in multiple files
[httpchat] / channel.sh
diff --git a/channel.sh b/channel.sh
new file mode 100755 (executable)
index 0000000..eab42fc
--- /dev/null
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+if [ "$(COOKIE nick)" ]; then
+  nickname="?$(COOKIE nick)"
+else
+  nickname='?Guest'
+fi
+  
+if [ -f "$chatfile" ]; then
+  read -r channelkey x <"$chatfile"
+  channelkey="$( printf '%s-%s' "$channelkey" "$SESSION_ID" |sha256sum)"
+fi
+
+case $(POST action) in
+  create)
+    if [ ! -f "$chatfile" ]; then
+      { randomid; printf ' '; STRING "$nickname"; echo; } >"$chatfile"
+    fi
+    REDIRECT "$(URL "/$LOCATION")"
+    ;;
+  submit)
+    if [ -f "$chatfile" -a "$channelkey" = "$(POST channelkey)" ]; then
+      printf "%s %s: %s\n" "$(date +%F_%T)" "$(STRING "$nickname")" "$(POST message |STRING)" >>"$chatfile"
+    fi
+    REDIRECT "$(URL "/$LOCATION")"
+    ;;
+  nick)
+    SET_COOKIE +1209600 "nick=$(POST nickname |URL)"
+    REDIRECT "$(URL "/$LOCATION")"
+    ;;
+  *) if [ ! -f "$chatfile" ]; then
+      yield_page create <<-EOF
+       [form #nonexist method=POST action="$(URL "/$LOCATION")"
+           There is no channel named $(HTML "$LOCATION")
+           [submit "action" "create" Create]
+        ]
+       EOF
+    else
+      { printf '
+        [form #channel method=POST action="%s"
+          [submit "action" "submit" style="display: none;"]
+          [input type=hidden name=channelkey value="%s"]
+          %s [input name="message" autofocus=true][submit "action" "submit" Send!]
+        ]
+      ' "$(URL "/$LOCATION")" "$channelkey" "$(settings_menu)"
+      SHESCAPE='s;[]&<>#."[];\\&;g;'
+
+      printf '[div #chat'
+      # tail -n30 -f "$chatfile" | {
+      #   read x
+      #   while read -r date nick message; do
+      #     printf '[p .message [span .date %s] [span .nick [span .indicator %s]%s:] [span .message %s]]\n' \
+      #            "${date#*_}" "${nick%${nick#?}}" "$(UNSTRING "${nick#?}" |HTML)" "$(UNSTRING "$message" |HTML)"
+      #     done
+      #   }
+      tail -n50 -f "$chatfile" \
+      | sed -nuE '
+        /^[^ ]+ [^ ]+ [^ ]+$/{
+        h; s;^([^ ]+) ([^ ]+) ([^ ]+)$;\1;; s;.*_;;;         s;.+;[p .message [span .date &];p;
+        g; s;^([^ ]+) ([^ ]+) ([^ ]+)$;a\2;; bESC; :A s;.;;; s;(.)(.+);[span .nick [span .indicator \1]\2];p;
+        g; s;^([^ ]+) ([^ ]+) ([^ ]+)$;b\3;; bESC; :B s;.;;; s;.+;[span .message &]];p;
+        }
+        b; :ESC
+        '"$UNSTRING"' '"$SHESCAPE"'
+        /^a/bA; /^b/bB;
+        '
+      } |yield_page channel
+    fi 
+    ;;
+esac