ZeroNet/plugins/Trayicon/TrayiconPlugin.py

172 lines
5.4 KiB
Python
Raw Normal View History

import os
import sys
import atexit
from Plugin import PluginManager
from Config import config
2016-12-03 13:42:23 +01:00
from Translate import Translate
allow_reload = False # No source reload supported in this plugin
plugin_dir = os.path.dirname(__file__)
2016-12-03 13:42:23 +01:00
if "_" not in locals():
_ = Translate(plugin_dir + "/languages/")
@PluginManager.registerTo("Actions")
class ActionsPlugin(object):
def main(self):
global notificationicon, winfolders
2019-03-15 21:06:59 +01:00
from .lib import notificationicon, winfolders
import gevent.threadpool
import main
self.main = main
icon = notificationicon.NotificationIcon(
2019-03-15 21:06:59 +01:00
os.path.join(os.path.dirname(os.path.abspath(__file__)), 'trayicon.ico'),
"ZeroNet %s" % config.version
)
self.icon = icon
self.console = False
@atexit.register
def hideIcon():
2019-12-17 15:02:39 +01:00
try:
icon.die()
except Exception as err:
print("Error removing trayicon: %s" % err)
ui_ip = config.ui_ip if config.ui_ip != "*" else "127.0.0.1"
2019-04-03 13:54:19 +02:00
if ":" in ui_ip:
ui_ip = "[" + ui_ip + "]"
2017-02-04 14:58:58 +01:00
icon.items = [
(self.titleIp, False),
(self.titleConnections, False),
(self.titleTransfer, False),
(self.titleConsole, self.toggleConsole),
(self.titleAutorun, self.toggleAutorun),
"--",
2016-12-03 13:42:23 +01:00
(_["ZeroNet Twitter"], lambda: self.opensite("https://twitter.com/HelloZeroNet")),
(_["ZeroNet Reddit"], lambda: self.opensite("http://www.reddit.com/r/zeronet/")),
(_["ZeroNet Github"], lambda: self.opensite("https://github.com/HelloZeroNet/ZeroNet")),
(_["Report bug/request feature"], lambda: self.opensite("https://github.com/HelloZeroNet/ZeroNet/issues")),
"--",
(_["!Open ZeroNet"], lambda: self.opensite("http://%s:%s/%s" % (ui_ip, config.ui_port, config.homepage))),
"--",
2016-12-03 13:42:23 +01:00
(_["Quit"], self.quit),
2017-02-04 14:58:58 +01:00
]
if not notificationicon.hasConsole():
del icon.items[3]
icon.clicked = lambda: self.opensite("http://%s:%s/%s" % (ui_ip, config.ui_port, config.homepage))
self.quit_servers_event = gevent.threadpool.ThreadResult(
lambda res: gevent.spawn_later(0.1, self.quitServers), gevent.threadpool.get_hub(), lambda: True
) # Fix gevent thread switch error
gevent.threadpool.start_new_thread(icon._run, ()) # Start in real thread (not gevent compatible)
super(ActionsPlugin, self).main()
icon._die = True
def quit(self):
self.icon.die()
self.quit_servers_event.set(True)
def quitServers(self):
self.main.ui_server.stop()
self.main.file_server.stop()
def opensite(self, url):
import webbrowser
webbrowser.open(url, new=0)
def titleIp(self):
title = "!IP: %s " % ", ".join(self.main.file_server.ip_external_list)
if any(self.main.file_server.port_opened):
2016-12-03 13:42:23 +01:00
title += _["(active)"]
else:
2016-12-03 13:42:23 +01:00
title += _["(passive)"]
return title
def titleConnections(self):
2016-12-03 13:42:23 +01:00
title = _["Connections: %s"] % len(self.main.file_server.connections)
return title
def titleTransfer(self):
2016-12-03 13:42:23 +01:00
title = _["Received: %.2f MB | Sent: %.2f MB"] % (
float(self.main.file_server.bytes_recv) / 1024 / 1024,
float(self.main.file_server.bytes_sent) / 1024 / 1024
)
return title
def titleConsole(self):
2016-12-03 13:42:23 +01:00
translate = _["Show console window"]
if self.console:
2016-12-03 13:42:23 +01:00
return "+" + translate
else:
2016-12-03 13:42:23 +01:00
return translate
def toggleConsole(self):
if self.console:
notificationicon.hideConsole()
self.console = False
else:
notificationicon.showConsole()
self.console = True
def getAutorunPath(self):
return "%s\\zeronet.cmd" % winfolders.get(winfolders.STARTUP)
def formatAutorun(self):
args = sys.argv[:]
2017-01-22 21:22:53 +01:00
if not getattr(sys, 'frozen', False): # Not frozen
args.insert(0, sys.executable)
cwd = os.getcwd()
2017-01-22 21:22:53 +01:00
else:
cwd = os.path.dirname(sys.executable)
2017-01-22 21:22:53 +01:00
ignored_args = [
"--open_browser", "default_browser",
"--dist_type", "bundle_win64"
]
if sys.platform == 'win32':
args = ['"%s"' % arg for arg in args if arg and arg not in ignored_args]
cmd = " ".join(args)
# Dont open browser on autorun
cmd = cmd.replace("start.py", "zeronet.py").strip()
2017-01-22 21:22:53 +01:00
cmd += ' --open_browser ""'
return "\r\n".join([
'@echo off',
'chcp 65001 > nul',
'set PYTHONIOENCODING=utf-8',
'cd /D \"%s\"' % cwd,
'start "" %s' % cmd
])
def isAutorunEnabled(self):
path = self.getAutorunPath()
return os.path.isfile(path) and open(path, "rb").read().decode("utf8") == self.formatAutorun()
def titleAutorun(self):
2016-12-03 13:42:23 +01:00
translate = _["Start ZeroNet when Windows starts"]
if self.isAutorunEnabled():
2016-12-03 13:42:23 +01:00
return "+" + translate
else:
2016-12-03 13:42:23 +01:00
return translate
def toggleAutorun(self):
if self.isAutorunEnabled():
os.unlink(self.getAutorunPath())
else:
open(self.getAutorunPath(), "wb").write(self.formatAutorun().encode("utf8"))