poezio/poezio/poezio.py

135 lines
3.7 KiB
Python
Raw Normal View History

2011-09-06 00:45:53 +00:00
# Copyright 2010-2011 Florent Le Coz <louiz@louiz.org>
2010-01-10 20:14:17 +00:00
#
# This file is part of Poezio.
#
# Poezio is free software: you can redistribute it and/or modify
2011-09-11 15:10:05 +00:00
# it under the terms of the zlib license. See the COPYING file.
2010-05-18 13:29:02 +00:00
"""
Starting point of poezio. Launches both the Connection and Gui
"""
2010-07-19 23:55:20 +00:00
import sys
2010-12-26 20:51:14 +00:00
import os
import signal
2017-11-12 14:03:09 +00:00
def test_curses():
"""
Check if the system ncurses linked with python has unicode capabilities.
"""
import curses
if hasattr(curses, 'unget_wch'):
return True
print("""\
ERROR: The current python executable is linked with a ncurses version that \
has no unicode capabilities.
This could mean that:
- python was built on a system where readline is linked against \
libncurses and not libncursesw
- python was built without ncursesw headers available
Please file a bug for your distribution or fix that on your system and then \
recompile python.
Poezio is currently unable to read your input or draw its interface properly,\
so it will now exit.""")
return False
2018-01-13 14:33:19 +00:00
def test_env():
"""
Check if the environment has the right variables set
"""
unset = set()
for i in ('HOME', 'PATH', 'TERM'):
if not os.environ.get(i):
unset.add(i)
if unset:
variables = ', '.join('$%s' % i for i in unset)
print('ERROR: %s not set' % variables)
return False
return True
def test_unicode():
2018-07-21 14:47:28 +00:00
from . import poopt
try:
poopt.wcswidth('')
except UnicodeError:
print("""\
ERROR: The current system is misconfigured for Unicode.
Check your locale setup, especially the $LANG environment variable and \
whether it matches a locale built on your system. Also check that it is a \
.UTF-8 locale, and not using some legacy encoding.
Poezio is unable to display characters properly, so it will now exit.""")
return False
return True
2011-03-07 18:57:55 +00:00
def main():
"""
2016-06-27 22:55:51 +00:00
Entry point.
2011-03-07 18:57:55 +00:00
"""
sys.stdout.write("\x1b]0;poezio\x07")
sys.stdout.flush()
2016-06-30 21:36:25 +00:00
from poezio import config
config.run_cmdline_args()
config.create_global_config()
config.setup_logging()
config.post_logging_setup()
2016-06-30 21:36:25 +00:00
from poezio.config import options
if options.check_config:
config.check_config()
sys.exit(0)
from poezio.asyncio import monkey_patch_asyncio_slixmpp
monkey_patch_asyncio_slixmpp()
2016-06-30 21:36:25 +00:00
from poezio import theming
theming.update_themes_dir()
2016-06-30 21:36:25 +00:00
from poezio import logger
logger.create_logger()
2016-06-30 21:36:25 +00:00
from poezio import roster
roster.create_roster()
2018-10-15 17:40:02 +00:00
from poezio.core.core import Core
2017-11-12 14:03:09 +00:00
signal.signal(signal.SIGINT, signal.SIG_IGN) # ignore ctrl-c
2018-10-15 17:40:02 +00:00
cocore = Core()
2017-11-12 14:03:09 +00:00
signal.signal(signal.SIGUSR1, cocore.sigusr_handler) # reload the config
signal.signal(signal.SIGHUP, cocore.exit_from_signal)
signal.signal(signal.SIGTERM, cocore.exit_from_signal)
2012-10-13 13:14:34 +00:00
if options.debug:
cocore.debug = True
2011-03-07 18:57:55 +00:00
cocore.start()
from slixmpp.exceptions import IqError, IqTimeout
2017-11-12 14:03:09 +00:00
def swallow_iqerrors(loop, context):
"""Do not log unhandled iq errors and timeouts"""
if not isinstance(context['exception'], (IqError, IqTimeout)):
loop.default_exception_handler(context)
# Warning: asyncio must always be imported after the config. Otherwise
# the asyncio logger will not follow our configuration and won't write
# the tracebacks in the correct file, etc
import asyncio
2014-09-21 18:28:17 +00:00
loop = asyncio.get_event_loop()
loop.set_exception_handler(swallow_iqerrors)
2014-09-21 18:28:17 +00:00
loop.add_reader(sys.stdin, cocore.on_input_readable)
loop.add_signal_handler(signal.SIGWINCH, cocore.sigwinch_handler)
cocore.xmpp.start()
2014-09-21 18:28:17 +00:00
loop.run_forever()
# We reach this point only when loop.stop() is called
try:
cocore.reset_curses()
except:
pass