• 0 Posts
  • 28 Comments
Joined 1 year ago
cake
Cake day: June 10th, 2023

help-circle
  • I’m sorry if I misinterpreted the quote about places with legal gun owners having less illegal gun owners. How else should I have interpreted it?

    You pulled a statistic, please provide a source for it.

    Yes, a person entering an empty room with a gun on the table is absolutely statistically in danger of mishandling the gun and harming themselves. The actual meta study referenced here is behind a paywall but people do not behave well when put in a room alone with a dangerous thing. As far as I can tell no one has replicated the experiment with an actual gun, though I’d love to see that. Now I don’t want to strawman too much here but you might be tempted to say that the problem isn’t the gun but the combination of human stupidity and guns. That’s generally what makes dangerous things dangerous, and isn’t the gotcha people on the gun side often think it is. In a world with only guns and no humans there’s no gun violence, hooray.

    I’ll let you have the final word here if you wish, I’m pretty done with this discussion. I’ll just reiterate one last time that this is all you trying to convince me that I should not be feeling more safe in a place that doesn’t allow guns and I think that’s pretty fucked.





  • None of what you just said is true. Starting here

    Just to be clear, walking into a room that has a gun in it doesn’t magically make you more likely to get shot.

    That’s nonsense, obviously there’s an increased probability with strict causation between being around guns and getting shot.

    If you’re in a place where legal gun owners are, and where illegal gun owners are unlikely to be (or at least unlikely to cause problems in)

    You seem to be pretending that “good guys with guns deter bad guys with guns”. I invite you to provide any source that backs this up. This is an American myth, and from outside it’s obvious that the presence of “good guys” with guns just make the criminal elements more likely to arm themselves. It also is increasingly obvious that a very large portion of the self proclaimed good guys are in fact also bad people just itching for an excuse.














  • If you look at the repo, the very first line in the readme links to an issue that briefly explains why you should care.

    Unmaintained software comes in two categories:

    1. The software is done. It does exactly what it was meant to do and it was written in a language and in such a way as to be pretty future proof. Examples are some basic code libraries or command line utilities.
    2. The software had to be updated all the time to keep up with changing environments and security problems, so the dev got sick of it and dropped it. Or a better solution came along so the developer felt free to finally drop the burden.

    Nativefier falls in the second category and the second clause. Don’t use it.


  • You asked for my python script but now I can’t seem to load that comment to reply directly to it. Anyway, here’s the script, I haven’t bothered to upload the repo anywhere. I’m sure it isn’t perfect but it works fine for me. The action for opening evolution when you click the tray icon is specific to hyprland so will probably need to be modified to suit your needs.

    import asyncio
    import concurrent.futures
    import logging
    import signal
    import sqlite3
    import sys
    from pathlib import Path
    from subprocess import run
    
    import pkg_resources
    from inotify_simple import INotify, flags
    from PySimpleGUIQt import SystemTray
    
    menu_def = ["BLANK", ["Exit"]]
    
    empty_icon = pkg_resources.resource_filename(
        "evolution_tray", "resources/inbox-empty.svg"
    )
    full_icon = pkg_resources.resource_filename(
        "evolution_tray", "resources/inbox-full.svg"
    )
    
    inotify = INotify()
    
    tray = SystemTray(filename=empty_icon, menu=menu_def, tooltip="Inbox empty")
    
    logging.getLogger("asyncio").setLevel(logging.WARNING)
    handler = logging.StreamHandler(sys.stdout)
    logger = logging.getLogger()
    logger.setLevel("DEBUG")
    logger.addHandler(handler)
    
    
    def handle_menu_events():
        while True:
            menu_item = tray.read()
            if menu_item == "Exit":
                signal.raise_signal(signal.SIGTERM)
            elif menu_item == "__ACTIVATED__":
                run(["hyprctl", "dispatch", "exec", "evolution"])
                # tray.update(filename=paused_icon)
    
            logger.info("Opened evolution")
    
    
    def get_all_databases():
        cache_path = Path.home() / ".cache" / "evolution" / "mail"
        return list(cache_path.glob("**/folders.db"))
    
    
    def check_unread() -> int:
        unread = 0
        for db in get_all_databases():
            conn = sqlite3.connect(db)
            cursor = conn.cursor()
            try:
                cursor.execute("select count(*) read from INBOX where read == 0")
                unread += cursor.fetchone()[0]
            except:
                pass
            finally:
                conn.close()
    
        if unread > 0:
            tray.update(filename=full_icon, tooltip=f"{unread} unread emails")
        else:
            tray.update(filename=empty_icon, tooltip="Inbox empty")
    
        return unread
    
    
    def watch_inbox():
        while True:
            for database in get_all_databases():
                inotify.add_watch(database, mask=flags.MODIFY)
            while inotify.read():
                logger.info("New mail")
                logger.info(f"{check_unread()} new emails")
    
    
    async def main():
        executor = concurrent.futures.ThreadPoolExecutor(max_workers=1)
        loop = asyncio.get_running_loop()
        check_unread()
    
        watch_task = asyncio.wait(
            fs={
                loop.run_in_executor(executor, watch_inbox),
            },
            return_when=asyncio.FIRST_COMPLETED,
        )
        await asyncio.gather(watch_task, loop.create_task(handle_menu_events()))
    
    
    def entrypoint():
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        signal.signal(signal.SIGTERM, signal.SIG_DFL)
    
        try:
            asyncio.run(main())
        except Exception as e:
            logger.exception(e)
    
    
    if __name__ == "__main__":
        entrypoint()