diff options
author | bill-auger <mr.j.spam.me@gmail.com> | 2018-09-10 09:45:49 +0000 |
---|---|---|
committer | bill-auger <mr.j.spam.me@gmail.com> | 2018-10-02 19:02:24 -0400 |
commit | d741c6c8831fc44e89e8158d10f01ddbd1c951b8 (patch) | |
tree | 7f4fa213fc145280dcb3e9748e95222d4a9a4e92 | |
parent | 478bc51a173e13d49c296e4b5178abc8ad847594 (diff) |
implement "translate a user" feature
-rw-r--r-- | modules/m_translate.sh | 106 |
1 files changed, 73 insertions, 33 deletions
diff --git a/modules/m_translate.sh b/modules/m_translate.sh index 31852b3..43637bb 100644 --- a/modules/m_translate.sh +++ b/modules/m_translate.sh @@ -38,6 +38,7 @@ module_translate_INIT() modinit_API='2' modinit_HOOKS='on_PRIVMSG' helpentry_module_translate_description="Provides support for translating messages." + #commands_register "$1" 'translate' || return 1 which apertium &>/dev/null || log_error "[TRANSLATE]: ERROR: module failed to load - cannot find the \`apertium\` program" which apertium &>/dev/null @@ -58,7 +59,8 @@ module_translate_REHASH() module_translate_on_PRIVMSG() # (hostmask , target , query) { - local hostmask=$1 + local sender + local hostmask=$1 ; parse_hostmask_nick "${hostmask}" 'sender' ; local target=$2 local query=$3 local bot_nick=${server_nick_current} @@ -66,21 +68,31 @@ module_translate_on_PRIVMSG() # (hostmask , target , query) DBG_TRANSLATE_CRITERIA - if ! is_translatable_channel "${target}" || - ! is_translate_request "${query}" - then was_handled=0 - - else local message="${query#* translate }" - local nick="$(echo "${message%% *}" | tr -d '/')" - -DBG_TRANSLATE - - if is_known_user ${nick} - then translate_user ${target} ${nick} - else translate_message ${target} "${message}" + if is_translatable_channel ${target} + then if is_translate_request "${query}" + then local command="$(expr "$query" : ${bot_nick}': \(!\?translate\)' )" + local message="$(expr "$query" : ${bot_nick}': !\?translate \(.*\)')" + local nick="$(echo "${message%% *}" | tr -d '/')" + local user_last_chat_line=$(get_user_last_chat_line ${nick}) + local lang_pair + + if [[ -n "${user_last_chat_line}" ]] + then set_translated_user ${nick} ${command} + message="${user_last_chat_line}" + lang_pair='es-en' + else lang_pair='en-es' + fi + + translate_message ${target} "${message}" ${lang_pair} + was_handled=1 + + else if is_translated_user ${sender} + then translate_message ${target} "${query}" + was_handled=1 + else was_handled=0 + fi fi - - was_handled=1 + else was_handled=0 fi # supress or allow further handling of this message @@ -90,6 +102,8 @@ DBG_TRANSLATE ## helpers ## +lowercase() { echo tr '[:upper:]' '[:lower:]' <<< "$*" ; } + is_translatable_channel() # (target) { local target=$1 @@ -102,34 +116,56 @@ is_translate_request() # (query) local query=$1 local bot_nick=${server_nick_current} - [[ "${query}" =~ ^"${bot_nick}: translate " ]] + [[ "${query}" =~ ^"${bot_nick}: translate " ]] || \ + [[ "${query}" =~ ^"${bot_nick}: !translate " ]] } -is_known_user() # (nick) +is_translated_user() # (sender) +{ + local sender=$1 + local flag_file=announcements/people/$(lowercase ${sender//\/})/IS_TRANSLATED + + [[ -f ${flag_file} ]] +} + +set_translated_user() # (nick , command) { local nick=$1 + local command=$2 + local flag_file=announcements/people/$(lowercase ${nick//\/})/IS_TRANSLATED + +DBG_SET_TRANSLATE_USER - [[ -n "${nick}" ]] && [[ -d announcements/people/${nick} ]] + if [[ "${command}" = 'translate' ]] + then touch ${flag_file} + else rm ${flag_file} + fi } -translate_user() # (target , nick) +get_user_last_chat_line() # (nick) { - local target=$1 - local nick=$2 + local nick=$1 + local bot_nick=${server_nick_current} + local match="$(module_seen_SELECT ${nick_lower})" + + [[ "$(lowercase ${nick})" == "$(lowercase ${bot_nick})" ]] && return 0 -DBG_TRANSLATE_USER + if [[ "${match}" =~ ([0-9]+)\|(#[^ |]+)\|(.*) ]] + then local timestamp=${BASH_REMATCH[1]} + local channel=${BASH_REMATCH[2]} + local chat_line="${BASH_REMATCH[3]}" + [[ ${chat_line} =~ ^ACTION\ (.*) ]] && chat_line="${BASH_REMATCH[1]}" - # translate previous chat from $nick from spanish to english - send_msg "${target}" "(not yet implemented)" + echo "${chat_line}" + fi } -translate_message() # (target , message) +translate_message() # (target , message , lang_pair) { local target=$1 local message=$2 - - # translate $message from english to spanish - local translated_message=$(echo "${message}" | apertium en-es) + local lang_pair=$3 + local translated_message=$(echo "${message}" | apertium ${lang_pair}) DBG_TRANSLATE_MSG @@ -144,9 +180,13 @@ DBG_TRANSLATE_CRITERIA() { (( ${DEBUG} )) || return - echo -n "[TRANSLATE]: target='${target}'" ; ! is_translatable_channel ${target} && echo -n " => wrong channel - returning" ; echo ; - echo -n "[TRANSLATE]: query='${query}'" ; ! is_translate_request "${query}" && echo -n " => not a translate request - returning" ; echo ; + echo -n "[TRANSLATE]: target='${target}'" ; ! is_translatable_channel ${target} && echo -n " => wrong channel - returning" ; echo ; + echo -n "[TRANSLATE]: query='${query}'" ; is_translate_request "${query}" && echo -n " => is translate command" || echo -n " => is not translate command" ; echo ; + if is_translate_request "${query}" + then echo -n "[TRANSLATE]: nick?=${nick}" ; ! [[ "$(get_user_last_chat_line ${nick})" ]] && echo -n " => is known user - translating prev user chat" || echo -n " => is not known user - translating arbitrary message" ; echo ; + else echo -n "[TRANSLATE]: sender=${sender}" ; is_translated_user ${sender} && echo -n " => is translated user - translating chat" || echo -n " => is not translated user - returning" ; echo ; + fi + } -DBG_TRANSLATE() { (( ${DEBUG} )) && echo "[TRANSLATE]: !!!triggered!!! $(is_known_user ${nick} && echo is_known_user nick=${nick} || echo message=${message})" ; } -DBG_TRANSLATE_USER() { (( ${DEBUG} )) && echo "[TRANSLATE]: translate_user() nick=${nick}" ; } -DBG_TRANSLATE_MSG() { (( ${DEBUG} )) && echo "[TRANSLATE]: translate_message() ${person} said: ${translated_message}" ; } +DBG_SET_TRANSLATE_USER() { (( ${DEBUG} )) && echo -n "[TRANSLATE]: command=${command} - setting translate $([[ "${command}" = 'translate' ]] && echo on || echo off) for nick=${nick}" ; echo ; } +DBG_TRANSLATE_MSG() { (( ${DEBUG} )) && echo "[TRANSLATE]: !!!triggered!!! ${person} said (${lang_pair}): ${translated_message}" ; } |