#!/bin/bash
#
# script: BotTerminal.sh
#
# Para melhor compreensão foram utilizados parâmetros longos nas funções; Podendo
# ser substituidos pelos parâmetros curtos respectivos.

# Importando API
source ShellBot.sh

# Token do bot
bot_token='<TOKEN_AQUI>'

# Inicializando o bot com log.
ShellBot.init --token "$bot_token" --monitor --flush --log_file "/tmp/${0##*/}.log"
ShellBot.username

# A definição da regra a seguir utiliza uma construção curta na declaração 
# de múltiplos comandos. Aplicando o recurso de expansão de variáveis e 
# argumentos posicionais é possível criar comandos/argumentos para adequação 
# da sintaxe, podendo ser distribuida em regras e tratamentos distintos.
#
# Comandos: /who, /date, /df e /du (regex)
ShellBot.setMessageRules 	--name 'terminal_comandos' 	\
							--chat_type	private			\
							--entitie_type bot_command	\
							--text '^/(who|date|df|du)[ ]+' \
							--exec '${1#/} ${*:2}'	# Remove a barra inicial do argumento posicional '$1' (bot comando) transformando-o
													# em um comando de shell válido e passa os argumentos posicionais subsequentes.
													#
													# Exemplo:
													#
													# Exibindo o contéudo do arquivo e enumerando as respectivas linhas.
													#
													# bot comando: /cat -n /etc/group /etc/passwd
													# exec: cat -n /etc/group /etc/passwd

# A regra abaixo demonstra a construção de uma linha de comando personalizada
# que recebe os elementos do texto como argumentos.
ShellBot.setMessageRules	--name 'filtrar_arquivo' 		\
							--chat_type private				\
							--entitie_type bot_command		\
							--command '/filtrar'			\
							--num_args 3					\
							--exec 'cat "$3" | egrep "$2"'	# Utilizando os argumentos posicionais.
															#
															# Exemplo:
															#
															# bot comando: /filtrar root /etc/group
															# exec: cat "/etc/group" | egrep "root"

# Definindo uma regra que contém um comando que lista recursivamente
# o contéudo do diretório especificado.
# Obs: Dependendo do diretório informado a saída poderá ser dividida
# em várias mensagens de retorno e no pior dos cenários o possível
# excesso de requisições.
ShellBot.setMessageRules	--name 'listar_diretorio'		\
							--chat_type private				\
							--entitie_type bot_command		\
							--command '/listar'				\
							--num_args 2					\
							--exec 'ls -R $2'				# Exemplo:
															#
															# bot comando: /listar /etc
															# exec: ls -R /etc

# Aplica regra de erro caso nenhuma das regras anteriores forem satisfeitas.
ShellBot.setMessageRules	--name 'comando_invalido'		\
							--chat_type private				\
							--entitie_type bot_command		\
							--bot_reply_message 'erro: comando não encontrado.'
while :
do
	# Obtem as atualizações
	ShellBot.getUpdates --limit 100 --offset $(ShellBot.OffsetNext) --timeout 30
	
	# Lista o índice das atualizações
	for id in $(ShellBot.ListUpdates)
	do
	# Inicio thread
	(
		# Gerenciar regras
		ShellBot.manageRules --update_id $id
		
	) & # Utilize a thread se deseja que o bot responda a várias requisições simultâneas.
	done
done
#FIM