58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
from typing import Dict, List
|
|
import discord
|
|
from discord.ui import View, Button
|
|
from FileBrowserSelect import FileBrowserSelect
|
|
|
|
class CommitActionsView(View):
|
|
"""Action buttons for a specific commit"""
|
|
def __init__(self, commit: Dict, files: List[Dict], timeout: int = 60):
|
|
super().__init__(timeout=timeout)
|
|
self.commit = commit
|
|
self.files = files
|
|
self.commit_sha = commit['sha']
|
|
self.commit_short = commit['sha'][:7]
|
|
|
|
# Link button that opens the commit in Gitea
|
|
link_button = Button(
|
|
label="🔗 Open in Gitea",
|
|
style=discord.ButtonStyle.link,
|
|
url=commit['html_url'],
|
|
emoji="🔗"
|
|
)
|
|
self.add_item(link_button)
|
|
|
|
# Add a file browser select if files exist
|
|
if files:
|
|
self.add_item(FileBrowserSelect(files, self.commit_sha))
|
|
|
|
@discord.ui.button(label="📊 View Diff", style=discord.ButtonStyle.primary)
|
|
async def view_diff(self, interaction: discord.Interaction, button: Button):
|
|
# Import here to avoid circular import with main.py
|
|
from main import show_commit_diff_interactive
|
|
await show_commit_diff_interactive(interaction, self.commit_sha)
|
|
|
|
@discord.ui.button(label="📁 Browse Files", style=discord.ButtonStyle.secondary)
|
|
async def browse_files(self, interaction: discord.Interaction, button: Button):
|
|
if not self.files:
|
|
await interaction.response.send_message("No files changed in this commit.", ephemeral=True)
|
|
return
|
|
|
|
embed = discord.Embed(
|
|
title=f"📁 Files in commit `{self.commit_short}`",
|
|
description="Select a file to view its diff:",
|
|
color=discord.Color.blue()
|
|
)
|
|
|
|
file_list = "\n".join([
|
|
f"• `{f['filename']}` (+{f.get('additions', 0)}/-{f.get('deletions', 0)})"
|
|
for f in self.files[:10]
|
|
])
|
|
if len(self.files) > 10:
|
|
file_list += f"\n... and {len(self.files) - 10} more"
|
|
|
|
embed.add_field(name="Changed Files", value=file_list, inline=False)
|
|
|
|
view = FileBrowserSelect(self.files, self.commit_sha)
|
|
await interaction.response.send_message(embed=embed, view=view, ephemeral=True)
|
|
|