You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

267 lines
9.6 KiB
Python

5 years ago
import argparse
5 years ago
import sys
import os
import six
from random import randint
5 years ago
import random
5 years ago
from PIL import Image, ImageOps
import curses
import sys, termios, tty, os, time
5 years ago
import apirequest
import imageprinter
import requests
5 years ago
import subprocess
from subprocess import check_output
import datetime
import time
class Printer():
ESC = b'\x1B'
CHANGE_EMULATION = ESC+b'\x7B'+b'\x65'
LINE_FEED = b'\n'
CARIDGE_RET = b'\x0D'
CHARWIDTH = 78
strokes = 0
5 years ago
debug = False
target = "/dev/usb/lp0"
if debug:
target = "/dev/tty"
def printchar(self,char):
with open(self.target, 'wb') as printer:
5 years ago
if self.debug:
printer.write(bytes(str(char), 'utf-8'))
else:
printer.write(self.ESC+b"\x7B"+b"\x41")
char=self.strokes*" "+char
printer.write(bytes(str(char), 'utf-8'))
printer.write(self.ESC+b"\x25"+b"\x46"+b"\x0F"+b"\x00"+b"\x04"+b"\x08"+b"\x00")
self.strokes += 1
if(self.strokes>self.CHARWIDTH):
printer.write(self.LINE_FEED)
self.strokes = 0
5 years ago
def printstring(self,string, formating="p"):
with open(self.target, 'wb') as printer:
5 years ago
if self.debug:
5 years ago
if formating == "u":
printer.write(b"\x1B"+b"\x5B"+b"\x34"+b"\x6D")
printer.write(bytes(str(string), 'utf-8'))
printer.write(b"\x1B"+b"\x5B"+b"\x30"+b"\x6D")
else:
printer.write(bytes(str(string), 'utf-8'))
5 years ago
else:
printer.write(self.ESC+b"\x7B"+b"\x41")
printer.write(bytes(str(string), 'utf-8'))
printer.write(self.ESC+b"\x25"+b"\x46"+b"\x0F"+b"\x00"+b"\x04"+b"\x08"+b"\x00")
5 years ago
try:
self.newline()
except:
time.sleep(1)
self.newline()
def newline(self):
global strokes
with open(self.target, 'wb') as printer:
printer.write(self.LINE_FEED)
self.strokes = 0
5 years ago
def printimagefromurl(self, url):
page = requests.get(url)
f_ext = os.path.splitext(url)[-1]
f_name = 'img{}'.format(f_ext)
with open(f_name, 'wb') as f:
f.write(page.content)
if printer.debug:
rows, columns = os.popen('stty size', 'r').read().split()
subprocess.call(["catimg","-w",columns,f_name])
else:
imageprinter.print(f_name)
class Terminal():
lineinput = ""
5 years ago
commandMode = True
writeloop = True
5 years ago
commands = {
"help":"get help on the commands",
"start":"start publication",
"list":"list theses and exercises",
"exercise <number>":"see the exercise with the <number> specified",
"thesis <number>":"see the thesis with the <number> specified",
"exit":"finish the publication",
}
5 years ago
def __init__(self,printer, persons):
self.printer = printer
5 years ago
self.persons = persons
def waittostart(self):
self.writeloop = True
while self.writeloop:
char = self.getch()
self.writeloop = False
self.lineinput = ""
continue
5 years ago
def waitforinput(self, nocommand=False):
5 years ago
self.writeloop = True
5 years ago
self.printer.printchar("> ")
while self.writeloop:
char = self.getch()
if (ord(char) == 27):
print("exit publication :-(")
exit(0)
if (ord(char) == 13):
self.printer.newline()
5 years ago
if not nocommand:
if not self.lineinput == "":
self.command(self.lineinput)
self.lineinput = ""
self.printer.printchar("> ")
else:
self.writeloop = False
else:
5 years ago
self.lineinput+=char
self.printer.printchar(char)
def getch(self):
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
5 years ago
def scanwifi(self):
self.printer.newline()
out = check_output(["nmcli", "dev", "wif"])
self.printer.printstring(out.decode("utf-8"))
def list(self):
printer.printstring("theses on POETIC SOFTWARE", "u")
result = apirequest.getcategory("thesis")
for i, line in enumerate(result):
printer.printstring(str(i+1)+" "+line)
printer.newline()
printer.printstring("exercises in POETIC SOFTWARE","u")
result = apirequest.getcategory("exercise")
for i, line in enumerate(result):
printer.printstring(str(i+1)+" "+line)
printer.newline()
5 years ago
def command(self, command):
#print("received command: "+str(command))
if "help" == str(command):
5 years ago
self.printer.printstring("The user in this publication is an active agent. The publication can be assembled according to your own wishes using commands. The following commands can be used.")
for key, help in self.commands.items():
self.printer.printstring(key+":")
self.printer.printstring(" "+help)
5 years ago
#self.writeloop = False
5 years ago
elif "list" == str(command):
self.list()
elif "start" == str(command) or "restart" == str(command):
main()
5 years ago
elif str(command).split(" ")[0] == "exercise" or str(command).split(" ")[0] == "thesis":
part = str(command).split(" ")[0]
5 years ago
arguments = str(command.strip()).split(" ")
arguments.pop(0)
if len(arguments) < 1:
self.printer.printstring("no argument given. Usage: "+part+" <number>")
else:
5 years ago
for i,arg in enumerate(arguments):
if arg.isdigit():
number = int(arg)
if number > len(apirequest.getcategory(part)):
self.printer.printstring("Number must be inbetween 1 and "+ str(len(apirequest.getcategory(part))))
else:
5 years ago
result = apirequest.getimages(part, number)
for img in result:
printer.printimagefromurl(img)
result = apirequest.gettitle(part, number)
for line in result:
self.printer.printstring(line, "u")
result = apirequest.getcontent(part, number)
5 years ago
for line in result:
self.printer.printstring(line)
5 years ago
if apirequest.gettitle(part, number)[0] == "Wifi Poem":
self.scanwifi()
5 years ago
self.printer.newline()
else:
5 years ago
self.printer.printstring("not a number")
5 years ago
elif str(command).split(" ")[0] == "whois":
if str(command).split(" ")[1] in self.persons:
self.printer.printstring(self.persons[str(command).split(" ")[1]])
else:
self.printer.printstring("Sorry not found, try " + random.choice(list(self.persons)))
elif "exit" == str(command):
5 years ago
self.printer.printstring("Imprint", "u")
self.printer.newline()
self.printer.printstring("2019, Piet Zwart Institute, Rotterdam")
self.printer.printstring("Published by Alexander Roidl")
self.printer.printstring("and (enter your name)")
self.printer.newline()
self.waitforinput(nocommand=True)
self.printer.newline()
self.printer.printstring("Special thanks to Aymeric Mansoux, Marloes de Valk, Michael Murtaugh, André Castro, Clara Balaguer, Amy Suo Wu, Leslie Robbins, Angeliki, Alice, Tash, Zalan, Joca, Jule")
5 years ago
self.printer.newline()
main()
else:
self.printer.printstring("~ command not found. try help for a list of available commands")
self.printer.newline()
#if the command is valid we want to execute the command and continue the story
#self.writeloop = False
5 years ago
persons = {
"Kittler":"Friedrich A. Kittler (June 12, 1943 October 18, 2011) was a literary scholar and a media theorist. His works relate to media, technology, and the military. ",
"Alex":"Alexander Roidl created Poetic Software as part of his Master's thesis"
}
printer = Printer()
5 years ago
term = Terminal(printer, persons)
5 years ago
now = datetime.datetime.now()
5 years ago
def main():
term.waittostart()
printer.printstring("W E L C O M E !")
5 years ago
printer.newline()
#printimagefromurl('https://apod.nasa.gov/apod/image/1701/potw1636aN159_HST_2048.jpg')
printer.printstring(now.strftime("%Y-%m-%d %H:%M"))
printer.newline()
5 years ago
printer.printstring("---------------")
printer.printstring("POETIC SOFTWARE")
printer.printstring("---------------")
printer.printstring("type help for help")
printer.newline()
5 years ago
result = apirequest.gettitle("introduction", 1)
for line in result:
printer.printstring(line, "u")
result = apirequest.getcontent("introduction", 1)
5 years ago
for line in result:
printer.printstring(line)
printer.newline()
5 years ago
term.list()
5 years ago
printer.printstring("SELECT which one to see, for exercise type: exercise <number> and for thesis type: thesis <number>")
printer.newline()
term.waitforinput()
main()