Compare commits
5 Commits
fb9f8a680f
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
042495cde2 | ||
|
|
b65bea7856 | ||
|
|
bd8deeb44e | ||
| 7f455f427e | |||
|
|
ddfa9fc2a3 |
57
.gitea/workflows/build-nightly.yml
Normal file
57
.gitea/workflows/build-nightly.yml
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
name: release-tag
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- dev
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release-image:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
DOCKER_LATEST: stable
|
||||||
|
CONTAINER_NAME: drb-client-discord-bot
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
|
- name: Set up Docker BuildX
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
with: # replace it with your local IP
|
||||||
|
config-inline: |
|
||||||
|
[registry."git.vpn.cusano.net"]
|
||||||
|
http = false
|
||||||
|
insecure = false
|
||||||
|
|
||||||
|
- name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: git.vpn.cusano.net # replace it with your local IP
|
||||||
|
username: ${{ secrets.GIT_REPO_USERNAME }}
|
||||||
|
password: ${{ secrets.GIT_REPO_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Get Meta
|
||||||
|
id: meta
|
||||||
|
run: |
|
||||||
|
echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_OUTPUT
|
||||||
|
echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Validate build configuration
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
call: check
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./Dockerfile
|
||||||
|
platforms: |
|
||||||
|
linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: | # replace it with your local IP and tags
|
||||||
|
git.vpn.cusano.net/${{ vars.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}/${{ env.CONTAINER_NAME }}:${{ steps.meta.outputs.REPO_VERSION }}
|
||||||
|
git.vpn.cusano.net/${{ vars.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}/${{ env.CONTAINER_NAME }}:${{ env.DOCKER_LATEST }}
|
||||||
@@ -9,7 +9,7 @@ jobs:
|
|||||||
release-image:
|
release-image:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
DOCKER_LATEST: nightly
|
DOCKER_LATEST: stable
|
||||||
CONTAINER_NAME: drb-client-discord-bot
|
CONTAINER_NAME: drb-client-discord-bot
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -43,21 +43,6 @@ class DiscordBotManager:
|
|||||||
|
|
||||||
@self.bot.event
|
@self.bot.event
|
||||||
async def on_voice_state_update(member, before, after):
|
async def on_voice_state_update(member, before, after):
|
||||||
# Check if the bot was disconnected
|
|
||||||
if member == self.bot.user and after.channel is None:
|
|
||||||
guild_id = before.channel.guild.id
|
|
||||||
if not self.voice_clients.get(guild_id):
|
|
||||||
LOGGER.info("Bot has left channel, reconnection ignored.")
|
|
||||||
return
|
|
||||||
LOGGER.info(f"Bot was disconnected from channel in guild {guild_id}. Attempting to reconnect...")
|
|
||||||
try:
|
|
||||||
await self.leave_voice_channel(guild_id)
|
|
||||||
except Exception as e:
|
|
||||||
LOGGER.warning(f"Error leaving voice channel: '{e}'")
|
|
||||||
# Attempt to reconnect to the channel after a brief pause
|
|
||||||
await asyncio.sleep(2)
|
|
||||||
await self.join_voice_channel(guild_id, before.channel.id)
|
|
||||||
|
|
||||||
if member == self.bot.user and before.channel is None and after.channel is not None:
|
if member == self.bot.user and before.channel is None and after.channel is not None:
|
||||||
print(f"{member.name} joined voice channel {after.channel.name}")
|
print(f"{member.name} joined voice channel {after.channel.name}")
|
||||||
self._voice_ready_event.set()
|
self._voice_ready_event.set()
|
||||||
@@ -75,10 +60,10 @@ class DiscordBotManager:
|
|||||||
LOGGER.info("Bot is ready, start_bot returning.")
|
LOGGER.info("Bot is ready, start_bot returning.")
|
||||||
return
|
return
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
LOGGER.error("Timeout waiting for bot to become ready. Bot might have failed to start.")
|
LOGGER.error("Timeout waiting for bot to become ready. Bot might have failed to start.")
|
||||||
if self.bot_task and not self.bot_task.done():
|
if self.bot_task and not self.bot_task.done():
|
||||||
self.bot_task.cancel()
|
self.bot_task.cancel()
|
||||||
raise RuntimeError("Bot failed to become ready within timeout.")
|
raise RuntimeError("Bot failed to become ready within timeout.")
|
||||||
|
|
||||||
async def stop_bot(self):
|
async def stop_bot(self):
|
||||||
async with self.lock:
|
async with self.lock:
|
||||||
@@ -130,8 +115,8 @@ class DiscordBotManager:
|
|||||||
LOGGER.info("Bot joined voice, returning.")
|
LOGGER.info("Bot joined voice, returning.")
|
||||||
return
|
return
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
LOGGER.error("Timeout waiting for bot to join voice.")
|
LOGGER.error("Timeout waiting for bot to join voice.")
|
||||||
raise RuntimeError("Bot failed to join voice within timeout.")
|
raise RuntimeError("Bot failed to join voice within timeout.")
|
||||||
|
|
||||||
async def leave_voice_channel(self, guild_id: int):
|
async def leave_voice_channel(self, guild_id: int):
|
||||||
if not self.bot:
|
if not self.bot:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import csv
|
import csv
|
||||||
import json
|
import json
|
||||||
from models import ConfigGenerator, DecodeMode, ChannelConfig, DeviceConfig, TrunkingConfig, TrunkingChannelConfig, AudioConfig, TerminalConfig, TalkgroupTag
|
from models import TalkgroupTag
|
||||||
from typing import List
|
from typing import List
|
||||||
from internal.logger import create_logger
|
from internal.logger import create_logger
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ from internal.logger import create_logger
|
|||||||
|
|
||||||
LOGGER = create_logger(__name__)
|
LOGGER = create_logger(__name__)
|
||||||
|
|
||||||
def create_bot_router(bot_manager: DiscordBotManager): # Function to create router
|
# Function to create router
|
||||||
|
def create_bot_router(bot_manager: DiscordBotManager):
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
# API Endpoints
|
# API Endpoints
|
||||||
@@ -54,4 +55,4 @@ def create_bot_router(bot_manager: DiscordBotManager): # Function to create rout
|
|||||||
}
|
}
|
||||||
return status
|
return status
|
||||||
|
|
||||||
return router # Return the configured router
|
return router
|
||||||
|
|||||||
@@ -3,10 +3,9 @@ import subprocess
|
|||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
import json
|
import json
|
||||||
from models import ConfigGenerator, DecodeMode, ChannelConfig, DeviceConfig, TrunkingConfig, TrunkingChannelConfig, AudioConfig, TerminalConfig, TalkgroupTag
|
from models import ConfigGenerator, DecodeMode, ChannelConfig, DeviceConfig, TrunkingConfig, TrunkingChannelConfig, AudioConfig, TerminalConfig
|
||||||
from internal.logger import create_logger
|
from internal.logger import create_logger
|
||||||
from internal.bot_manager import DiscordBotManager
|
from internal.bot_manager import DiscordBotManager
|
||||||
from typing import List
|
|
||||||
from internal.op25_config_utls import save_talkgroup_tags, save_whitelist, del_none_in_dict, get_current_system_from_config
|
from internal.op25_config_utls import save_talkgroup_tags, save_whitelist, del_none_in_dict, get_current_system_from_config
|
||||||
|
|
||||||
LOGGER = create_logger(__name__)
|
LOGGER = create_logger(__name__)
|
||||||
@@ -115,8 +114,8 @@ def create_op25_router(bot_manager: DiscordBotManager):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(status_code=500, detail=str(e))
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
|
|
||||||
@router.post("/update-prensece")
|
@router.post("/update-presence")
|
||||||
async def update_prensece():
|
async def update_presence():
|
||||||
current_system = get_current_system_from_config()
|
current_system = get_current_system_from_config()
|
||||||
if not current_system:
|
if not current_system:
|
||||||
raise HTTPException(status_code=500, detail="Unable to get current system.")
|
raise HTTPException(status_code=500, detail="Unable to get current system.")
|
||||||
@@ -125,4 +124,3 @@ def create_op25_router(bot_manager: DiscordBotManager):
|
|||||||
return current_system
|
return current_system
|
||||||
|
|
||||||
return router
|
return router
|
||||||
|
|
||||||
|
|||||||
@@ -5,4 +5,3 @@ uvicorn
|
|||||||
fastapi
|
fastapi
|
||||||
pyaudio
|
pyaudio
|
||||||
argparse
|
argparse
|
||||||
pyaudio
|
|
||||||
Reference in New Issue
Block a user