diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..e38ad42 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,53 @@ +[build-system] +requires = ["setuptools>=61.2"] +build-backend = "setuptools.build_meta" + +[project] +name = "Slixprint" +version = "0.1" +description = "Printer bot for XMPP" +authors = [{name = "Schimon Zachary", email = "sch@fedora.email"}] +license = {text = "MIT"} +classifiers = [ + "Framework :: slixmpp", + "Intended Audience :: End Users/Desktop", + "License :: OSI Approved :: MIT License", + "Natural Language :: English", + "Programming Language :: Python", + "Topic :: Communications :: Chat", + "Topic :: Internet :: XMPP", + "Topic :: Office/Business", + "Topic :: Printing", + "Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Printer", +] +keywords = [ + "bot", + "chat", + "im", + "jabber", + "print", + "xmpp", +] +dependencies = [ + "pdfkit", + "pycups", + "python-magic", + "requests", + "slixmpp", + "reportlab", +] + +[project.urls] +Homepage = "http://slixprint.i2p/" +Repository = "https://gitgud.io/sjehuda/slixprint" +Issues = "https://gitgud.io/sjehuda/slixprint/issues" + +[project.readme] +text = "Slixprint is a printer bot for XMPP." + +[project.scripts] +slixprint = "slixprint.py" + +[tool.setuptools] +platforms = ["any"] +[tool.setuptools.package-data] diff --git a/slixprint.py b/slixprint.py index 3314dae..63e5777 100644 --- a/slixprint.py +++ b/slixprint.py @@ -5,13 +5,14 @@ # This file is part of Slixmark. # See the file LICENSE for copying permission. +import asyncio from getpass import getpass from argparse import ArgumentParser import cups import logging import magic -import pdfkit -# from reportlab.pdfgen import canvas +# import pdfkit +from reportlab.pdfgen import canvas import requests import slixmpp import time @@ -19,7 +20,7 @@ import xml.sax.saxutils as saxutils class Actions: - def determine_mimetype(content): + def determine_mimetype(content) -> str: m = magic.Magic(mime=True) mimetype = m.from_buffer(content) return mimetype @@ -28,18 +29,44 @@ class Actions: response = requests.get(url) content = response.content return content - - def export_to_pdf(filename): - # text = content.decode("utf-8") - # pdfkit.from_string(text, filename + '.pdf') - pdfkit.from_file(filename, filename + '.pdf') + # Generate document using wkhtmltopdf + # def export_to_pdf(filename): + # # text = content.decode("utf-8") + # # pdfkit.from_string(text, filename + '.pdf') + # pdfkit.from_file(filename, filename + '.pdf') - # c = canvas.Canvas("Content.pdf") - # # Add content to the canvas according to your requirements here - # c.showPage() - # c.drawString(100, 750, "Hello World") - # c.save() + # Single page as high as the number of lines + # def export_to_pdf(content, filename): + # with open(filename, 'r') as f: + # lines = f.readlines() + # x = 5 + # y = 800 + # line_height = 18 + # y_adjustment = 22 + # page_length = line_height*len(lines) + y_adjustment + # c = canvas.Canvas(filename + '.pdf',pagesize=(595, page_length)) + # y = page_length-line_height + # for line in lines: + # line = line.rstrip() + # c.drawString(x, y, line) + # y -= line_height + # c.save() + + def export_to_pdf(content, filename): + with open(filename, 'r') as f: + lines = f.readlines() + x = 5 + y = 800 + c = canvas.Canvas(filename + '.pdf') + for line in lines: + line = line.rstrip() + c.drawString(x, y, line) + y -= 18 + if y < 36: + c.showPage() + y = 800 + c.save() def write_document(content, filename): with open(filename, 'wb') as f: @@ -171,11 +198,26 @@ class Slixprint(slixmpp.ClientXMPP): name='slixprint', node=None, jid=self.boundjid.full) + while True: + rtt = None + try: + rtt = await self['xep_0199'].ping(self.boundjid.bare, + ifrom=self.boundjid, + timeout=10) + logging.info('Success! RTT: %s', rtt) + except Exception as e: + logging.error(str(e)) + self.disconnect() + await asyncio.sleep(60) async def discovery(self, DiscoInfo): jid = DiscoInfo['from'] await self['xep_0115'].update_caps(jid=jid) + async def on_connection_failed(self, event): + await asyncio.sleep(5) + self.reconnect(wait=5.0) + async def process_message(self, message): """ Process incoming message stanzas. Be aware that this also @@ -204,7 +246,7 @@ class Slixprint(slixmpp.ClientXMPP): error = Actions.print_document(filename) if error: logging.error(error) - Actions.export_to_pdf(filename) + Actions.export_to_pdf(content, filename) url_upload = await self['xep_0363'].upload_file( filename + '.pdf') message_body = 'Error: {text}'.format(text=error) @@ -247,9 +289,9 @@ class Slixprint(slixmpp.ClientXMPP): var='printer') for printer in printers: options.addOption(printer, printers[printer]["device-uri"]) - session['has_next'] = True - session['next'] = self._handle_printer - session['payload'] = form + session = {'has_next' : True, + 'next' : self._handle_printer, + 'payload' : form} return session def _handle_cancel(self, payload, session): @@ -272,7 +314,6 @@ class Slixprint(slixmpp.ClientXMPP): session['notes'] = [['info', text_note]] return session - if __name__ == '__main__': # Setup the command line arguments. parser = ArgumentParser(description=Slixprint.__doc__) @@ -315,7 +356,7 @@ if __name__ == '__main__': xmpp.register_plugin('xep_0115') # Entity Capabilities xmpp.register_plugin('xep_0122') # Data Forms Validation xmpp.register_plugin('xep_0199') # XMPP Ping - # xmpp.register_plugin('xep_0363') # HTTP File Upload + xmpp.register_plugin('xep_0363') # HTTP File Upload # Connect to the XMPP server and start processing XMPP stanzas. xmpp.connect()