* Added base admin login/logout flows * Ignore local database * Channel model * Admin interface for channels and plugins * Added database tests along with workflows * Added some docstrings * Ignore .coverage file * Creating plugins docs WIP * Documentation * Black everything * Some documentation * Coverage for the plugins package as well * DB Fixes * Absolute FROM in Dockerfile * Database and logging fixes * Slack: Support private channels * Added pre-commit * black'd * Fixed UserQuery.create * Fixed ChannelPluginQuery.create exists call * Added ChannelPlugin menu for debugging * Ignore sqlite databases * Updated contributing docs
64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
import threading
|
|
import traceback
|
|
import queue
|
|
|
|
import structlog
|
|
|
|
from butterrobot.db import ChannelQuery
|
|
from butterrobot.platforms import get_available_platforms
|
|
from butterrobot.platforms.base import Platform
|
|
from butterrobot.plugins import get_available_plugins
|
|
|
|
logger = structlog.get_logger(__name__)
|
|
q = queue.Queue()
|
|
|
|
|
|
def handle_message(platform: str, request: dict):
|
|
try:
|
|
message = get_available_platforms()[platform].parse_incoming_message(
|
|
request=request
|
|
)
|
|
except Platform.PlatformAuthResponse as response:
|
|
return response.data, response.status_code
|
|
except Exception as error:
|
|
logger.error(
|
|
"Error parsing message",
|
|
platform=platform,
|
|
error=error,
|
|
traceback=traceback.format_exc(),
|
|
)
|
|
return
|
|
|
|
if not message or message.from_bot:
|
|
return
|
|
|
|
try:
|
|
channel = ChannelQuery.get_by_platform(platform, message.chat)
|
|
except ChannelQuery.NotFound:
|
|
# If channel is still not present on the database, create it (defaults to disabled)
|
|
channel = ChannelQuery.create(
|
|
platform, message.chat, channel_raw=message.channel.channel_raw
|
|
)
|
|
|
|
if not channel.enabled:
|
|
return
|
|
|
|
for plugin_id, channel_plugin in channel.plugins.items():
|
|
if not channel.has_enabled_plugin(plugin_id):
|
|
continue
|
|
|
|
for response_message in get_available_plugins()[plugin_id].on_message(
|
|
message, plugin_config=channel_plugin.config
|
|
):
|
|
get_available_platforms()[platform].methods.send_message(response_message)
|
|
|
|
|
|
def worker_thread():
|
|
while True:
|
|
item = q.get()
|
|
handle_message(item["platform"], item["request"])
|
|
q.task_done()
|
|
|
|
|
|
# turn-on the worker thread
|
|
worker = threading.Thread(target=worker_thread, daemon=True).start()
|