-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
131 lines (96 loc) · 3.58 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import socket
import requests
class MessageServer:
"""Class that allows a connection to and from a single client."""
def __init__(self):
"""Initialises server socket and listens for a connection."""
self.server_socket = None
self.listen_for_connection()
def listen_for_connection(self):
"""Function that listens for a connection."""
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
local_ip = '127.0.0.1'
local_port = 65432
self.server_socket.bind((local_ip, local_port))
print("Listening for incoming connection...")
self.server_socket.listen()
self.connection, address = self.server_socket.accept()
print(f"Connection to {address} established. Suilad!")
def receive_message(self):
"""Function that receives a message from the connected client.
Returns:
str: The message from the client.
"""
data = self.connection.recv(1024)
if not data:
return
received_message = data.decode('utf-8')
print(received_message)
return received_message
def send_message(self, message):
"""Function that sends a message to the connected client.
Args:
message (str): Message being sent to the client.
"""
self.connection.sendall(str(message).encode('utf-8'))
def close_server(self):
"""Function that closes the server socket."""
self.server_socket.close()
class Translator:
"""Class that translates a message received by the server."""
def __init__(self, url):
"""Initialises the Translator.
Args:
url (str): URL of the translation API
"""
self.url = url
def translate(self, text):
"""Function that translates text.
Args:
text (str): Translated text from the json file.
Returns:
str: Translated message if no error evaluated
str: Error message if error evaluated
"""
querystring = {
"text": text
}
response = requests.request("POST", self.url, data=querystring)
response_json = response.json()
print(response_json)
if "error" in response_json:
return (response_json["error"]["message"], True)
else:
contents = response_json["contents"]
translation = contents["translated"]
return (translation, False)
# Class for Sindarin language.
# Tested to also work with Quenya API. Open to adding more in the future.
# TODO: Add Class for Quenya Translator.
# TODO: Add function to determine user's translation choice.
# TODO: Optional. Add Orcish and Klingon Translator options.
class SindarinTranslator(Translator):
"""Class that inherits from Translator.
Provides access to the Sindarin translation API.
"""
def __init__(self):
URL = "https://api.funtranslations.com/translate/sindarin.json"
Translator.__init__(self, URL)
def main():
"""Function that starts the program.
Program exits on client '/quit' prompt or API request limit.
"""
translation_server = MessageServer()
translator = SindarinTranslator()
while True:
message = translation_server.receive_message()
if not message:
continue
if message == "/quit":
break
translation, is_error = translator.translate(message)
translation_server.send_message(translation)
if is_error:
break
translation_server.close_server()
main()