Git Product home page Git Product logo

ofisalitabot's Introduction

OfisalitaBot

Contribución

Micro-tutorial

Para agregar un comando, se debe agregar el Handler apropiado en main.py. El más común es CommandHandler, que parsea los mensajes de tipo /comando. A este handler se le da la función de callback que llamará, y ésta debe ir en un archivo .py en la carpeta commands. En esa función se puede hacer lo que sea que Python pueda hacer.

Para mandar un mensaje está creada la función try_msg en los utils, que es solamente un proxy de la función real (context.bot.send_message) y su gracia es que se le puede dar un número de attempts para re-intentar el envío. Esto está hecho porque existe un bug en el que si el bot está inactivo por un tiempo, el siguiente mensaje falla uwu.

El comando más simple es tup en commands/response.py. Revisarlo para ver un ejemplo de cómo se hace.

Los comandos ya establecidos tienen el decorador @member_exclusive que se encarga de verificar que el usuario que ejecuta el comando es miembro del grupo. Si no lo es, no se ejecuta el comando. Si estás corriendo localmente el bot, puedes cambiar el valor debug en config/auth.py a True para que no verifique esto.

Estructura

  • config
    • auth.py: Constantes relacionadas a la autenticación del bot y usuarios (e.g. token del bot, IDs de admins). No está en el repo Y NO DEBERÍA ESTAR, porque el token es privadest.
    • db.py: Configuración relacionada a la base de datos.
    • logger.py: Configuración relacionada al logging del bot.
    • persistence.py: Configuración de la persistencia, i.e. cómo guardar la base de datos interna del bot (user_data, chats_data).
  • data
    • db.sqlite3: Ruta por defecto de la base de datos.
  • main.py: Carga la data necesaria, asigna los comandos disponibles e inicializa el polling del bot.
  • commands: Define las funciones que se ejecutan cuando se usa un comando de Telegram, asignados en main.py.
    • acronyms.py: Comandos relacionados a las siglas.
    • admin.py: Comandos relacionados a la administración del bot.
    • counter.py: Comandos relacionados a contadores numéricos.
    • list.py: Comandos relacionados a listas de cosas.
    • response.py: Comandos relacionados a responder a ciertos mensajes.
    • text.py: Comandos relacionados a alterar texto.
  • data.py: Define las funciones para interactuar con SQLite.
  • bot.py: Contiene el Updater que controla el bot y variables relacionadas.
  • functions.py: Funciones auxiliares complejas y específicas de cierta funcionalidad. e.g. load/save de data, web querying, scrappers, etc.
  • utils.py: Funciones auxiliares genéricas abstraídas para facilitar sintáxis. e.g. manejo de strings, conversión de formatos, etc.
  • root.py: Sirve de anca para el directorio del bot.

Uso

Siglas

Se pueden registar siglas y su significado, y luego usarlas en cualquier mensaje para que el bot las convierta en su significado.

  • /siglar [text | reply] - Convierte el argumento en una sigla, y lo guarda a la base de datos.
  • /desiglar [text | reply] - Convierte el argumento (sigla) en su texto corresponidente.
  • /glosario [l] - Muestra el glosario de siglas, con la opción de filtrar por letra.

Contadores

Se pueden crear mensajes que son contadores numéricos. A estos contadores se les puede sumar o restar un valor.

  • /contador [text] - Crear un mensaje tipo contador, con el texto dado como título.
  • /[sumar | incrementar] [number] (reply) - Incrementa el contador al que se responde, con 1 o el valor que se le da.
  • /[restar | decrementar] [number] (reply) - Decrementa el contador al que se responde, con 1 o el valor que se le da.

Listas

Se pueden crear mensajes que son listas. A estas listas se les puede agregar, quitar o editar items colaborativamente.

  • /[lista | listar] [text] - Crea una lista con el texto dado como título.
  • /agregar [text] (reply) - Agrega el texto dado como item a la lista a la que se responde.
  • /quitar [index] (reply) - Quita el item del índice dado de la lista a la que se responde.
  • /editar [index] [text] (reply) - Edita el item del índice dado de la lista a la que se responde, con el texto dado.
  • /[deslistar | cerrar] (reply) - Hace ineditable la lista a la que se responde.

Respuestas

Comandos que instan al bot a responder algo particular.

  • /start - Responde un saludo.
  • /tup - Responde "tup".
  • /[gracias | garcias] - Responde un sticker de "denarda".
  • /asistencia - Responde con un poll de días de la semana para ver cuándo asiste cada persona.
  • /hello - Responde como reply al mensaje al que se responde.

Texto

Comandos que toman un texto, y lo modifican o procesan de alguna forma.

  • /slashear (reply) - Responde con el texto del mensaje al que se responde en un texto camel case con un slash.
  • /['uwuspeech' | 'uwuspeak' | 'uwuizar' | 'uwu'] [text | reply] - Responde con el texto del mensaje al que se responde en un texto uwu-ificado.
  • /repetir [text | reply] - Responde con el mismo texto del argumento.
  • /distancia (reply) - Responde con la cantidad de mensajes que se han enviado entre la invocación y el mensaje al que se le está haciendo reply.

OpenAI/GPT

  • /gpt [text | reply] - Genera una respuesta al texto del argumento. Usa el modelo Anthropic Claude Sonnet.
  • /gb [text | reply] - Rellena los guiones bajos del texto del argumento, usando el modelo Anthropic Claude Sonnet. A veces cambia un poco el texto original.
  • /desigliar [text | reply] - Inventa una desiglación para una sigla usando el modelo Anthropic Claude Sonnet.

Admin

  • /get_log - Muestra el log del bot por interno a los IDs configurados como admins.
  • /prohibir (reply) - Hace que el bot elimine el mensaje al que se le responde (solo mensajes del bot).

ofisalitabot's People

Contributors

scisneros avatar nyveon avatar wituwitu avatar bkorecic avatar svandich avatar beltranamenabar avatar r8vnhill avatar tomyahu avatar

Stargazers

 avatar Gonzalo Alarcón Usui avatar Francisco Muñoz avatar  avatar  avatar  avatar  avatar  avatar Sebastián Aguilera avatar

Watchers

Kostas Georgiou avatar  avatar  avatar

ofisalitabot's Issues

Privatizar comandos

Estado actual: la mayoría de los comandos pueden ser invocados por cualquier persona con acceso al bot (no le digan a nadie)

Sugerencia: agregar un @decorator que ejecute, antes del código de cualquier comando, una función que verifique si el usuario que invoca el comando cumple cierta propiedad.

Hint: El código para /glosario hace eso al inicio. Ese bloque de código se puede encapsular en un decorator y chantárselo a todas las funciones de comandos.

Comando uwuspeech

Soy fan, pero /uwuspeech es un poco fome de escribir. Preferiría /uwuizar, /uwu o algo así. ¿Qué piensan?

Salwudos cwordiales

Actualizar readme

Hay varios comandos nuevos que no están en el readme (/resumir, /quepaso, quizás otros también). Estaría bueno aprovechar de revisar que el resto de la documentación siga relevante también

Human birthdays

A special list type with birthdays, so that the bot can congratulate people on their birthdays

General: /prohibir

A veces el bot se porta mal o hay mucho spam, o hay algún error en un comando. Un comando para eliminar mensajes del bot podría ser útil.

/siglar no considera texto entre separadores

Aplicar /siglar a textos como (broma) o :j_____: entrega ( o : respectivamente. Se esperaría que entregase (b) o :j:. Extrapolaría este comportamiento a otras puntuaciones que rodeen un texto para mantener las puntuaciones pero siglar el texto. Estimada Red, qué opinamos?

No uso Arch.

Concatenar message arguments y reply en comandos

Actualmente pasa esto:

image

Cuando hay un comando haciéndole reply a algo que además tiene un argumento, se prioriza el argumento para la acción. Un comportamiento más intuitivo sería que considere el reply y el argumento juntos.

Siglas: o_ct

Automatically recognize the format o_ct as Hola [List of people with names starting with this letter] Como Estás

Roles and group tagging

Allow assignment of roles so that group tags can be issued.

For example: bob and alice have the lunch role

/tag lunch would tag bob and alice in a message.

/siglar no sigla bien strings con paréntesis balanceados en substrings

El bot sigla correctamente si los paréntesis se encuentran en los extremos:
/siglar (broma) -> (b)

Pero si no, sólo aparece el paréntesis inicial:
/siglar si yo (siguiera) leyendo el chat -> sy(lec

Es deseable que en el ejemplo anterior el bot siglase a sy(s)lec.

Se debe tener cuidado con el caso en el que los paréntesis balanceados estén anidados y con el caso en el que no estén balanceados.

Se sugiere el siguiente comportamiento:

/siglar (broma) -> (b)
/siglar si yo (siguiera) leyendo el chat -> sy(s)lec
/siglar es (b) -> e(b)
/siglar es mi pijama (baloian! (es (b))) -> emp(b(e(b)))
/siglar hola :) -> h:
/siglar chao ): -> c)

No uso arch.

YPQNM está mal escr*to

En la función "desigliar" se le pasan siglas y sus significados como contexto a la IA, pero la sigla relativa a "y por que no me" está escrita como "ypqn" en vez de "ypqnm". Esto puede causar irregularidades en la interpretación del bot respecto de nuevas siglas al intentar generarles un significado coherente.

Lista automática de comandos

Un comando que retorne la lista de comandos con sus descripciones (a base de los docstrings?). Idealmente iría de la mando con lo hecho en #55 para incluirlo en el decorador.

Serviría también para configurar los tooltips del bot, y para actualizar el readme.

Contadores

Un sistema para crear un contador, y poder sumarle y restarle a ese contador.

Python 3.13

Estamos bastante atrasados con la versión de python...

Bot birthday

The bot should congratulate itself on it's own birthday!

Listas: /deslistar

Un comando para quitarle o cambiarle el hashtag a una lista, para que en la barra de búsqueda no aparezcan listas de prueba, o irrelevantes por ejemplo.

/ub

Get the current price of UBs

What API? No idea B)

Listas: /editar

Un comando para editar un item de una lista ya existente. Algo del estilo /editar [indice] [contenido nuevo]

Editar con un índice de 0 podría cambiar el título.

Ya está bueno ya

Cambiemos las funcionalidades de /lista a usar la bdd en vez de que sea stateless, y a usar botoncitos inline

Convertir dolares a pesos

Según tasa de intercambio del momento, en particular para las funcionalidades de resumir cuando te dicen el precio

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.