You need to sign in or sign up before continuing.
errordialog.py 2.22 KB
Newer Older
1
import webbrowser, subprocess, re
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
from gi.repository import Gtk, GLib, Gdk, Adw

@Gtk.Template(resource_path='/ru/eepm/PlayGUI/widgets/errordialog.ui')
class ErrorDialog(Adw.Dialog):
    __gtype_name__ = 'ErrorDialog'
    textview = Gtk.Template.Child()

    tg_button = Gtk.Template.Child()
    gh_button = Gtk.Template.Child()

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.textbuffer = self.textview.get_buffer()

        self.error = None

        self.tg_button.connect("activated", self.on_tg_clicked)
        self.gh_button.connect("activated", self.on_gh_clicked)

    def append_log(self, text):
22 23
        self.textbuffer.set_text(text)
        self.textview.scroll_to_mark(self.textbuffer.get_insert(), 0, False, 0.0, 1.0)  # Прокручиваем к курсору
24 25

    def present_error(self, win, error):
26 27 28
        self.error = None
        self.build_log(error)
        self.append_log(self.error)
29 30
        self.present(win)

31 32 33 34 35 36
    def build_log(self, error):
        separator = "_________________"
        distro_info = subprocess.run(
            ["epm", "print", "info"],
            capture_output=True, text=True, check=True).stdout

37
        seen = set()
38
        filtered_error_lines = [
39
            line for line in error.splitlines() if '%' not in line and not (line in seen or seen.add(line))
40 41 42 43 44 45 46 47 48 49 50 51 52
        ]

        filtered_error = '\n'.join(filtered_error_lines)

        filtered_error = re.sub(r'\n{3,}', '\n\n', filtered_error)

        if filtered_error_lines and "command:" in filtered_error_lines[0].lower():
            first_line = filtered_error_lines[0]
            self.error = f"{first_line}\n{separator}\n{distro_info}\n{separator}\n" + '\n'.join(
                filtered_error.splitlines()[-30:])
        else:
            self.error = f"{distro_info}\n{separator}\n" + '\n'.join(filtered_error.splitlines()[-30:])

53 54 55 56 57 58 59 60 61 62 63 64
    def copy_error(self):
        display = Gdk.Display.get_default()
        clipboard = display.get_clipboard()
        clipboard.set(self.error)

    def on_tg_clicked(self, button):
        self.copy_error()
        webbrowser.open("https://t.me/useepm")

    def on_gh_clicked(self, button):
        self.copy_error()
        webbrowser.open("https://github.com/Etersoft/eepm/issues")