Add file PyProject.
Add a hint (Thank you Trbl). Add connectivity handler. Replace pdfkit by reportlab.
This commit is contained in:
parent
64b8cc167c
commit
dd559dcf82
2 changed files with 113 additions and 19 deletions
53
pyproject.toml
Normal file
53
pyproject.toml
Normal file
|
@ -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]
|
77
slixprint.py
77
slixprint.py
|
@ -5,13 +5,14 @@
|
||||||
# This file is part of Slixmark.
|
# This file is part of Slixmark.
|
||||||
# See the file LICENSE for copying permission.
|
# See the file LICENSE for copying permission.
|
||||||
|
|
||||||
|
import asyncio
|
||||||
from getpass import getpass
|
from getpass import getpass
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
import cups
|
import cups
|
||||||
import logging
|
import logging
|
||||||
import magic
|
import magic
|
||||||
import pdfkit
|
# import pdfkit
|
||||||
# from reportlab.pdfgen import canvas
|
from reportlab.pdfgen import canvas
|
||||||
import requests
|
import requests
|
||||||
import slixmpp
|
import slixmpp
|
||||||
import time
|
import time
|
||||||
|
@ -19,7 +20,7 @@ import xml.sax.saxutils as saxutils
|
||||||
|
|
||||||
class Actions:
|
class Actions:
|
||||||
|
|
||||||
def determine_mimetype(content):
|
def determine_mimetype(content) -> str:
|
||||||
m = magic.Magic(mime=True)
|
m = magic.Magic(mime=True)
|
||||||
mimetype = m.from_buffer(content)
|
mimetype = m.from_buffer(content)
|
||||||
return mimetype
|
return mimetype
|
||||||
|
@ -29,18 +30,44 @@ class Actions:
|
||||||
content = response.content
|
content = response.content
|
||||||
return content
|
return content
|
||||||
|
|
||||||
|
# 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')
|
||||||
|
|
||||||
def export_to_pdf(filename):
|
# Single page as high as the number of lines
|
||||||
# text = content.decode("utf-8")
|
# def export_to_pdf(content, filename):
|
||||||
# pdfkit.from_string(text, filename + '.pdf')
|
# with open(filename, 'r') as f:
|
||||||
pdfkit.from_file(filename, filename + '.pdf')
|
# lines = f.readlines()
|
||||||
|
# x = 5
|
||||||
# c = canvas.Canvas("Content.pdf")
|
# y = 800
|
||||||
# # Add content to the canvas according to your requirements here
|
# line_height = 18
|
||||||
# c.showPage()
|
# y_adjustment = 22
|
||||||
# c.drawString(100, 750, "Hello World")
|
# 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()
|
# 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):
|
def write_document(content, filename):
|
||||||
with open(filename, 'wb') as f:
|
with open(filename, 'wb') as f:
|
||||||
f.write(content)
|
f.write(content)
|
||||||
|
@ -171,11 +198,26 @@ class Slixprint(slixmpp.ClientXMPP):
|
||||||
name='slixprint',
|
name='slixprint',
|
||||||
node=None,
|
node=None,
|
||||||
jid=self.boundjid.full)
|
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):
|
async def discovery(self, DiscoInfo):
|
||||||
jid = DiscoInfo['from']
|
jid = DiscoInfo['from']
|
||||||
await self['xep_0115'].update_caps(jid=jid)
|
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):
|
async def process_message(self, message):
|
||||||
"""
|
"""
|
||||||
Process incoming message stanzas. Be aware that this also
|
Process incoming message stanzas. Be aware that this also
|
||||||
|
@ -204,7 +246,7 @@ class Slixprint(slixmpp.ClientXMPP):
|
||||||
error = Actions.print_document(filename)
|
error = Actions.print_document(filename)
|
||||||
if error:
|
if error:
|
||||||
logging.error(error)
|
logging.error(error)
|
||||||
Actions.export_to_pdf(filename)
|
Actions.export_to_pdf(content, filename)
|
||||||
url_upload = await self['xep_0363'].upload_file(
|
url_upload = await self['xep_0363'].upload_file(
|
||||||
filename + '.pdf')
|
filename + '.pdf')
|
||||||
message_body = 'Error: {text}'.format(text=error)
|
message_body = 'Error: {text}'.format(text=error)
|
||||||
|
@ -247,9 +289,9 @@ class Slixprint(slixmpp.ClientXMPP):
|
||||||
var='printer')
|
var='printer')
|
||||||
for printer in printers:
|
for printer in printers:
|
||||||
options.addOption(printer, printers[printer]["device-uri"])
|
options.addOption(printer, printers[printer]["device-uri"])
|
||||||
session['has_next'] = True
|
session = {'has_next' : True,
|
||||||
session['next'] = self._handle_printer
|
'next' : self._handle_printer,
|
||||||
session['payload'] = form
|
'payload' : form}
|
||||||
return session
|
return session
|
||||||
|
|
||||||
def _handle_cancel(self, payload, session):
|
def _handle_cancel(self, payload, session):
|
||||||
|
@ -272,7 +314,6 @@ class Slixprint(slixmpp.ClientXMPP):
|
||||||
session['notes'] = [['info', text_note]]
|
session['notes'] = [['info', text_note]]
|
||||||
return session
|
return session
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# Setup the command line arguments.
|
# Setup the command line arguments.
|
||||||
parser = ArgumentParser(description=Slixprint.__doc__)
|
parser = ArgumentParser(description=Slixprint.__doc__)
|
||||||
|
@ -315,7 +356,7 @@ if __name__ == '__main__':
|
||||||
xmpp.register_plugin('xep_0115') # Entity Capabilities
|
xmpp.register_plugin('xep_0115') # Entity Capabilities
|
||||||
xmpp.register_plugin('xep_0122') # Data Forms Validation
|
xmpp.register_plugin('xep_0122') # Data Forms Validation
|
||||||
xmpp.register_plugin('xep_0199') # XMPP Ping
|
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.
|
# Connect to the XMPP server and start processing XMPP stanzas.
|
||||||
xmpp.connect()
|
xmpp.connect()
|
||||||
|
|
Loading…
Reference in a new issue