Make it work, add translations

This commit is contained in:
Thijs Raymakers 2025-05-28 22:41:13 +02:00
parent d437c5ef5c
commit 87662b6966
No known key found for this signature in database
5 changed files with 154 additions and 65 deletions

175
main.py
View file

@ -1,21 +1,56 @@
import asyncio import asyncio
import pjsua2 as pj import pjsua2 as pj
from threading import Thread
from markupsafe import escape from markupsafe import escape
from unificontrol import UnifiClient from unificontrol import UnifiClient
from dotenv import load_dotenv from dotenv import load_dotenv
from os import getenv from os import getenv
from ssl import get_server_certificate from ssl import get_server_certificate
from flask import Flask, request, render_template, Response, send_from_directory from flask import Flask, request, render_template, Response, send_from_directory
from queue import Queue
from time import sleep
import os import os
app = Flask(__name__) app = Flask(__name__)
app.config['TEMPLATES_AUTO_RELOAD'] = True app.config['TEMPLATES_AUTO_RELOAD'] = True
global unifi global unifi
QUEUE = Queue()
VISITOR_COUNT_FILE = "visitor_count" VISITOR_COUNT_FILE = "visitor_count"
SIP = None
def phone(hostname, username, password): LIB = None
def call():
# Initialize lib
LIB = pj.Endpoint()
LIB.libCreate()
ep_cfg = pj.EpConfig()
LIB.libInit(ep_cfg)
transport_cfg = pj.TransportConfig()
transport_cfg.port = 5060
LIB.transportCreate(pj.PJSIP_TRANSPORT_UDP, transport_cfg)
LIB.libStart()
while True:
try:
id = QUEUE.get(block = True)
sip_server = str(getenv("SIP_SERVER"))
sip_username = str(getenv("SIP_USERNAME"))
sip_password = str(getenv("SIP_PASSWORD"))
# Spawn audio on phone
call_phone(sip_server, sip_username, sip_password)
# authorize guest after a certain amount of time
unifi.authorize_guest(id, 1)
except:
sleep(5)
def call_phone(hostname, username, password):
class MyAccount(pj.Account): class MyAccount(pj.Account):
def __init__(self): def __init__(self):
pj.Account.__init__(self) pj.Account.__init__(self)
@ -32,28 +67,7 @@ def phone(hostname, username, password):
ci = self.getInfo() ci = self.getInfo()
print("Call state:", ci.stateText) print("Call state:", ci.stateText)
def onCallMediaState(self, prm): # Account config
ci = self.getInfo()
for mi in ci.media:
if mi.type == pj.MediaType.AUDIO and mi.status == pj.MediaStatus.ACTIVE:
aud_med = self.getMedia(mi.index)
aud_med.startTransmit(lib.endpoint.audDevManager().getPlaybackDevMedia())
lib.endpoint.audDevManager().getCaptureDevMedia().startTransmit(aud_med)
# Initialize lib
lib = pj.Endpoint()
lib.libCreate()
ep_cfg = pj.EpConfig()
lib.libInit(ep_cfg)
transport_cfg = pj.TransportConfig()
transport_cfg.port = 5060
lib.transportCreate(pj.PJSIP_TRANSPORT_UDP, transport_cfg)
lib.libStart()
# Account config
acc_cfg = pj.AccountConfig() acc_cfg = pj.AccountConfig()
acc_cfg.idUri = f"sip:{username}@{hostname}" acc_cfg.idUri = f"sip:{username}@{hostname}"
acc_cfg.regConfig.registrarUri = f"sip:{hostname}" acc_cfg.regConfig.registrarUri = f"sip:{hostname}"
@ -63,15 +77,12 @@ def phone(hostname, username, password):
acc = MyAccount() acc = MyAccount()
acc.create(acc_cfg) acc.create(acc_cfg)
# Make call # Make call
call = MyCall(acc, f"sip:3002@{hostname}") call = MyCall(acc, f"sip:3002@{hostname}")
# Keep the program running # Keep the program running for the duration of the ringtone
import time sleep(18)
time.sleep(30) del call
# Clean up
lib.libDestroy()
def main(): def main():
@ -86,19 +97,14 @@ def main():
USERNAME = str(getenv("USERNAME")) USERNAME = str(getenv("USERNAME"))
PASSWORD = str(getenv("PASSWORD")) PASSWORD = str(getenv("PASSWORD"))
SIP_SERVER = str(getenv("SIP_SERVER"))
SIP_USERNAME = str(getenv("SIP_USERNAME"))
SIP_PASSWORD = str(getenv("SIP_PASSWORD"))
phone(SIP_SERVER, SIP_USERNAME, SIP_PASSWORD)
cert = get_server_certificate((HOSTNAME, 443)) cert = get_server_certificate((HOSTNAME, 443))
global unifi global unifi
unifi = UnifiClient(host=HOSTNAME, unifi = UnifiClient(host=HOSTNAME,
username=USERNAME, password=PASSWORD, cert=cert) username=USERNAME, password=PASSWORD, cert=cert)
Thread(target=call).start()
app.run(host="0.0.0.0", port=80) app.run(host="0.0.0.0", port=80)
def visitor_count(): def visitor_count():
@ -116,22 +122,105 @@ def visitor_count():
print(f"error {e}") print(f"error {e}")
return visitor_count return visitor_count
LANG_EN = {
"Inbellen bij TechInc": "Dialup with TechInc",
"TechInc inbel portaal": "TechInc dialup portal",
"GRATIS": "FREE",
"Gratis": "Free",
"gratis": "freely",
"Verbind": "Connect for",
"met het wereldwijde web": "with the world wide web",
"Openen van telefoonlijn...": "Opening the phone line...",
"Bellen naar TechInc...": "Calling into TechInc...",
"Ontvang verbindingsopties...": "Receiving the connection options...",
"Uitzetten van echo onderdrukking...": "Disabling the echo suppression...",
"Breedbandspectrum peilen...": "Probing wide-spectrum...",
"Equalizer en echo-onderdrukkingstraining...": "Equalizer and echo-suppression training....",
"Verbinding met TechInc is gelegd!": "Connection with TechInc has been established!",
"openbaar": "publicly",
"Welkom, surfer!": "Welcome, surfer!",
"Onze snelle telefoon lijn is": "Our fast phone line is",
"en": "and",
"beschikbaar": "available",
"Via onderstaande knop kan je inbellen via je modem.": "With the buttom below you can dial up with your modem",
"Inbellen via TechInc heeft de volgende voordelen": "Dial up via TechInc has the following advantages",
"Altijd en overal toegang": "Always and everywhere access",
"tot het internet via uw telefoonlijn": "to the internet via your telephone line",
"Compatibel met alle gangbare 14.4k, 28.8k en 56k modems": "Compatible with all common 14.4k, 28.8k and 56k modems",
"Geen installatie nodig": "No installation required!",
"werkt direct met Windows 95/98 en Netscape Navigator": "works instantly with Windows 95/98 and Netscape Navigator",
"Ondersteuning voor e-mail, nieuwsgroepen en Internet Relay Chat (IRC)": "Support for e-mail, newsgroups and Internet Relay Chat (IRC)",
"Beveiligde verbinding via ons eigen TechInc-netwerk": "Secure connecton with our own TechInc network",
"u betaalt helemaal niets": "you don't pay anything",
"ook niet voor de gespreksduur!": "not even for the duration of the call!",
"doe-het-zelf helpdesk voor al uw internetvragen": "do-it-yourself helpdesk for all your internet questions",
"Verbind nu!": "Connect now!",
"/afbeeldingen/verbind.gif": "/afbeeldingen/connect.gif",
"U BENT BEZOEKER NUMMER": "YOU ARE VISITOR NUMBER"
}
LANG_NL = {
"Inbellen bij TechInc": "Inbellen bij TechInc",
"TechInc inbel portaal": "TechInc inbel portaal",
"GRATIS": "GRATIS",
"Gratis": "Gratis",
"gratis": "gratis",
"Verbind": "Verbind",
"met het wereldwijde web": "met het wereldwijde web",
"Openen van telefoonlijn...": "Openen van telefoonlijn...",
"Bellen naar TechInc...": "Bellen naar TechInc...",
"Ontvang verbindingsopties...": "Ontvang verbindingsopties...",
"Uitzetten van echo onderdrukking...": "Uitzetten van echo onderdrukking...",
"Breedbandspectrum peilen...": "Breedbandspectrum peilen...",
"Equalizer en echo-onderdrukkingstraining...": "Equalizer en echo-onderdrukkingstraining...",
"Verbinding met TechInc is gelegd!": "Verbinding met TechInc is gelegd!",
"openbaar": "openbaar",
"Welkom, surfer!": "Welkom, surfer!",
"Onze snelle telefoon lijn is": "Onze snelle telefoon lijn is",
"en": "en",
"beschikbaar": "beschikbaar",
"Via onderstaande knop kan je inbellen via je modem.": "Via onderstaande knop kan je inbellen via je modem.",
"Inbellen via TechInc heeft de volgende voordelen": "Inbellen via TechInc heeft de volgende voordelen",
"Altijd en overal toegang": "Altijd en overal toegang",
"tot het internet via uw telefoonlijn": "tot het internet via uw telefoonlijn",
"Compatibel met alle gangbare 14.4k, 28.8k en 56k modems": "Compatibel met alle gangbare 14.4k, 28.8k en 56k modems",
"Geen installatie nodig": "Geen installatie nodig",
"werkt direct met Windows 95/98 en Netscape Navigator": "werkt direct met Windows 95/98 en Netscape Navigator",
"Ondersteuning voor e-mail, nieuwsgroepen en Internet Relay Chat (IRC)": "Ondersteuning voor e-mail, nieuwsgroepen en Internet Relay Chat (IRC)",
"Beveiligde verbinding via ons eigen TechInc-netwerk": "Beveiligde verbinding via ons eigen TechInc-netwerk",
"u betaalt helemaal niets": "u betaalt helemaal niets",
"ook niet voor de gespreksduur!": "ook niet voor de gespreksduur!",
"doe-het-zelf helpdesk voor al uw internetvragen": "doe-het-zelf helpdesk voor al uw internetvragen",
"Verbind nu!": "Verbind nu!",
"/afbeeldingen/verbind.gif": "/afbeeldingen/verbind.gif",
"U BENT BEZOEKER NUMMER": "U BENT BEZOEKER NUMMER"
}
LANG = {
'nl': LANG_NL,
'en': LANG_EN
}
@app.route('/guest/s/default/', methods=["GET"]) @app.route('/guest/s/default/', methods=["GET"])
def root(): def root():
supported_languages = ["en", "nl"]
lang = request.accept_languages.best_match(supported_languages)
id = escape(request.args.get('id')) id = escape(request.args.get('id'))
page = render_template("index.html", dialing_up=False, id=id, visitor_count=visitor_count()) page = render_template("index.html", dialing_up=False, id=id, lang=LANG[lang], visitor_count=visitor_count())
response = Response(page, mimetype="text/html") response = Response(page, mimetype="text/html")
return response return response
@app.route("/dialup", methods=["POST"]) @app.route("/dialup", methods=["POST"])
def dialup(): def dialup():
# Spawn audio on phone supported_languages = ["en", "nl"]
# authorize guest after a certain amount of time lang = request.accept_languages.best_match(supported_languages)
id = escape(request.args.get('id')) id = escape(request.args.get('id'))
page = render_template("index.html", dialing_up=True, id=id, visitor_count=visitor_count())
#unifi.authorize_guest(id, 1) page = render_template("index.html", dialing_up=True, id=id, lang=LANG[lang], visitor_count=visitor_count())
response = Response(page, mimetype="text/html") response = Response(page, mimetype="text/html")
QUEUE.put(id)
return response return response
@app.route('/afbeeldingen/<path:path>') @app.route('/afbeeldingen/<path:path>')

BIN
static/connect.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
static/connect.xcf Normal file

Binary file not shown.

BIN
techinc_dialup.wav Normal file

Binary file not shown.

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>Inbellen bij TechInc</TITLE> <TITLE>{{ lang["Inbellen bij TechInc"] }}</TITLE>
<SCRIPT type="text/javascript"> <SCRIPT type="text/javascript">
(function() { (function() {
var blinks = document.getElementsByTagName('blink'); var blinks = document.getElementsByTagName('blink');
@ -18,30 +18,30 @@
window.onload = function () { window.onload = function () {
var status = document.getElementById('status'); var status = document.getElementById('status');
console.log(status); console.log(status);
status.innerHTML = "Openen van telefoonlijn..."; status.innerHTML = "{{lang["Openen van telefoonlijn..."]}}";
setTimeout(function() { setTimeout(function() {
status.innerHTML = "Bellen naar TechInc..."; status.innerHTML = "{{ lang["Bellen naar TechInc..."]}}";
}, 768); }, 768);
setTimeout(function() { setTimeout(function() {
status.innerHTML = "Ontvang verbindingsopties..."; status.innerHTML = "{{ lang["Ontvang verbindingsopties..."] }}";
}, 5086); }, 5086);
setTimeout(function() { setTimeout(function() {
status.innerHTML = "Uitzetten van echo onderdrukking..."; status.innerHTML = "{{ lang["Uitzetten van echo onderdrukking..."] }}";
}, 8861); }, 8861);
setTimeout(function() { setTimeout(function() {
status.innerHTML = "Breedbandspectrum peilen..."; status.innerHTML = "{{ lang["Breedbandspectrum peilen..."] }}";
}, 12123); }, 12123);
setTimeout(function() { setTimeout(function() {
status.innerHTML = "Equalizer en echo-onderdrukkingstraining..."; status.innerHTML = "{{ lang["Equalizer en echo-onderdrukkingstraining..."] }}";
}, 13695); }, 13695);
setTimeout(function() { setTimeout(function() {
status.innerHTML = "Verbinding met TechInc is gelegd!"; status.innerHTML = "{{ lang["Verbinding met TechInc is gelegd!"] }}";
}, 18326); }, 18326);
} }
{% endif %} {% endif %}
@ -54,7 +54,7 @@
<FONT SIZE="+4"> <FONT SIZE="+4">
<MARQUEE DIRECTION="up" HEIGHT="50px"> <MARQUEE DIRECTION="up" HEIGHT="50px">
<CENTER> <CENTER>
<B>TechInc inbel portaal</B> <B>{{ lang["TechInc inbel portaal"] }}</B>
</CENTER> </CENTER>
</MARQUEE> </MARQUEE>
</FONT> </FONT>
@ -64,22 +64,22 @@
<TD> <TD>
<P> <P>
<CENTER> <CENTER>
<H2>Verbind <FONT COLOR="red"><BLINK>GRATIS</BLINK></FONT> met het wereldwijde web</H2> <H2>{{ lang["Verbind"] }} <FONT COLOR="red"><BLINK>{{ lang["GRATIS"] }}</BLINK></FONT> {{ lang["met het wereldwijde web"] }}</H2>
</CENTER> </CENTER>
<P> <P>
Welkom, surfer! Onze snelle telefoon lijn is <B><I><FONT COLOR="FUCHSIA">openbaar</FONT></I></B> en <B><I><FONT COLOR="FUCHSIA">gratis</FONT></I></B> beschikbaar. {{ lang["Welkom, surfer!"] }} {{ lang["Onze snelle telefoon lijn is"] }} <B><I><FONT COLOR="FUCHSIA">{{ lang["openbaar"] }}</FONT></I></B> {{lang["en"]}} <B><I><FONT COLOR="FUCHSIA">{{lang["gratis"]}}</FONT></I></B> {{lang["beschikbaar"]}}.
Via onderstaande knop kan je inbellen via je modem. {{ lang["Via onderstaande knop kan je inbellen via je modem."]}}
</P> </P>
<CENTER><H3>Inbellen via TechInc heeft de volgende voordelen</H3></CENTER> <CENTER><H3>{{lang["Inbellen via TechInc heeft de volgende voordelen"]}}</H3></CENTER>
<P> <P>
<UL> <UL>
<LI><I>Altijd en overal toegang</I> tot het internet via uw telefoonlijn</LI> <LI><I>{{lang["Altijd en overal toegang"]}}</I> {{lang["tot het internet via uw telefoonlijn"]}}</LI>
<LI>Compatibel met alle gangbare 14.4k, 28.8k en 56k modems</LI> <LI>{{lang["Compatibel met alle gangbare 14.4k, 28.8k en 56k modems"]}}</LI>
<LI><B>Geen installatie nodig</B> werkt direct met Windows 95/98 en Netscape Navigator</LI> <LI><B>{{lang["Geen installatie nodig"]}}</B> {{lang["werkt direct met Windows 95/98 en Netscape Navigator"]}}</LI>
<LI>Ondersteuning voor e-mail, nieuwsgroepen en Internet Relay Chat (IRC)</LI> <LI>{{lang["Ondersteuning voor e-mail, nieuwsgroepen en Internet Relay Chat (IRC)"]}}</LI>
<LI>Beveiligde verbinding via ons eigen TechInc-netwerk</LI> <LI>{{lang["Beveiligde verbinding via ons eigen TechInc-netwerk"]}}</LI>
<LI><B>Gratis: <FONT COLOR="RED">u betaalt helemaal niets</FONT></B>, ook niet voor de gespreksduur!</LI> <LI><B>{{lang["Gratis"]}}: <FONT COLOR="RED">{{lang["u betaalt helemaal niets"]}}</FONT></B>, {{lang["ook niet voor de gespreksduur!"]}}</LI>
<LI><I>24/7</I> doe-het-zelf helpdesk voor al uw internetvragen</LI> <LI><I>24/7</I> {{lang["doe-het-zelf helpdesk voor al uw internetvragen"]}}</LI>
</UL> </UL>
</P> </P>
<HR> <HR>
@ -108,7 +108,7 @@
<HR> <HR>
<P> <P>
<CENTER> <CENTER>
<H2>U BENT BEZOEKER <FONT COLOR="red"><BLINK>{{visitor_count}}</BLINK></FONT>!</H2> <H2>{{lang["U BENT BEZOEKER NUMMER"]}} <FONT COLOR="red"><BLINK>{{visitor_count}}</BLINK></FONT>!</H2>
</CENTER> </CENTER>
{% if dialing_up %} {% if dialing_up %}
<CENTER> <CENTER>
@ -117,7 +117,7 @@
{% else %} {% else %}
<FORM METHOD="POST" ACTION="/dialup"> <FORM METHOD="POST" ACTION="/dialup">
<INPUT TYPE="hidden" NAME="id" VALUE="{{id}}"> <INPUT TYPE="hidden" NAME="id" VALUE="{{id}}">
<CENTER><INPUT TYPE="image" VALUE="Verbind nu!" src="/afbeeldingen/verbind.gif"></INPUT></CENTER> <CENTER><INPUT TYPE="image" VALUE="{{lang["Verbind nu!"]}}" src="{{lang["/afbeeldingen/verbind.gif"]}}"></INPUT></CENTER>
</FORM> </FORM>
{% endif %} {% endif %}
</P> </P>