URI: 
       annna-start-services: match tags with awk and allow more chars in tagname - annna - Annna the nice friendly bot.
  HTML git clone git://bitreich.org/annna/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/annna/
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
       ---
   DIR commit 08482dd4d9ee32d6c664d729c243f971d8882a1a
   DIR parent 364c9d54b991011af5d7696c9d0d2df2b4079337
  HTML Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Fri, 13 Nov 2020 10:47:22 +0100
       
       annna-start-services: match tags with awk and allow more chars in tagname
       
       This implementation avoids looping over entire hashtags.txt for
       every message that the bot sees.  There is also an option to recognize
       multiple tags per message, although this is disabled by default
       (print_n_hashtags=1).
       
       Signed-off-by: Annna Robert-Houdin <annna@bitreich.org>
       
       Diffstat:
         M annna-start-services                |      41 ++++++++++++++-----------------
       
       1 file changed, 19 insertions(+), 22 deletions(-)
       ---
   DIR diff --git a/annna-start-services b/annna-start-services
       @@ -17,6 +17,7 @@ iiroot="/home/annna/irc"
        iibase="/home/annna/irc/chat.freenode.net"
        modbase="/home/annna/bin/modules/"
        hashtagfile="${modbase}/hashtags/hashtags.txt"
       +print_n_hashtags=1
        
        hashtags() {
                cat ${hashtagfile} 2>/dev/null
       @@ -656,28 +657,24 @@ annna_common() {
                                randomtag=$(($randomtag - 1))
                        done
                else
       -                tagname=""
       -                taguri=""
       -                for tag in $(hashtags);
       -                do
       -                        [ -z "${tagname}" ] && tagname="${tag}" && continue
       -                        taguri="${tag}"
       -
       -                        case "${text}" in
       -                        *\#nospoil*)
       -                                break;
       -                                ;;
       -                        *${tagname}[^a-zA-Z-]*)
       -                                annna-say -c "${channel}" "${tagname}: ${taguri}"
       -                                break;
       -                                ;;
       -                        *${tagname})
       -                                annna-say -c "${channel}" "${tagname}: ${taguri}"
       -                                break;
       -                                ;;
       -                        esac
       -                        tagname=""
       -                done
       +                printf '%s' "$text" | awk -v taglimit="$print_n_hashtags" '
       +                {
       +                        if ($0 ~ /#/ && $0 !~ /#nospoil/) {
       +                                for (i = 1; i <= NF; i++) {
       +                                        if (match($i, /#[A-z0-9\+-]*/)) {
       +                                                tags[j++] = substr($i, RSTART, RLENGTH)
       +                                        }
       +                                }
       +                        }
       +                }
       +                END {
       +                        for (tag in tags) {
       +                                if (k++ < taglimit)
       +                                        print tags[tag]
       +                        }
       +                }' | while read -r tag; do
       +                        tagline="$(grep "${tag} " "${tagfile}")"
       +                        annna-say -c "${channel}" "${tagline% *}: ${tagline#* }"
                fi
        
                # Membership Level.