-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathds_messenger.py
More file actions
107 lines (92 loc) · 3.99 KB
/
ds_messenger.py
File metadata and controls
107 lines (92 loc) · 3.99 KB
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
'''Module for handing direct messages in the DS server'''
import json
import socket
import time
import ds_protocol
#from ds_client import send_and_recv
PORT = 3021
class DirectMessage(dict):
'''Class for individual direct messages.'''
def __init__(self, recipient, message, timestamp = 0, sender = None):
self.recipient = recipient
self.message = message
self.timestamp = timestamp
self.sender = sender
if self.timestamp == 0:
self.timestamp = time.time()
dict.__init__(self, entry=self.message,
recipient=self.recipient,
timestamp=self.timestamp,
sender=self.sender)
class DirectMessenger:
'''Class for handling sending and recieving direct messages.'''
def __init__(self, dsuserver=None, username=None, password=None):
self.dsuserver = dsuserver
self.username = username
self.password = password
self.dms_out = []
if self.dsuserver is None:
self.sent = None
self.recv = None
self.token = None
else:
self.sent, self.recv, self.token = join_server(self.dsuserver,
self.username,
self.password)
def send(self, message:str, recipient:str) -> bool:
''' returns true if message successfully sent, false if send failed. '''
if self.sent and self.recv:
new_dm = DirectMessage(recipient, message, 0, self.username)
new_dm_str = json.dumps(new_dm)
post_msg = f'{{"token":"{self.token}", "directmessage": {new_dm_str}}}'
recv_msg = send_and_recv(self.sent, self.recv, post_msg)
if recv_msg.type == "ok":
self.dms_out.append(new_dm)
return True
return False
def retrieve_new(self) -> list:
''' returns a list of DirectMessage objects containing all new messages '''
retrieve_msg = f'{{"token":"{self.token}", "directmessage": "new"}}'
return self.retrieve(retrieve_msg)
def retrieve_all(self) -> list:
''' returns a list of DirectMessage objects containing all messages'''
retrieve_msg = f'{{"token":"{self.token}", "directmessage": "all"}}'
return self.retrieve(retrieve_msg)
def retrieve(self, retrieve_msg):
''' returns a list of DirectMessage objects as specified '''
dm_list = []
if self.sent and self.recv:
recv_msg = send_and_recv(self.sent, self.recv, retrieve_msg)
if recv_msg.type == "ok" and isinstance(recv_msg.messages, list):
for msg in recv_msg.messages:
dm = DirectMessage(self.username, msg["message"], msg["timestamp"], msg["from"])
dm_list.append(dm)
return dm_list
def join_server(dsuserver, username, password):
'''Joins the DSU server using the given username and password.'''
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sent, recv, token = (None, None, None)
try:
client.connect((dsuserver, PORT))
sent = client.makefile('w')
recv = client.makefile('r')
join_msg = f'''{{"join": {{"username": "{username}",
"password": "{password}",
"token":""}}}}'''
recv_msg = send_and_recv(sent, recv, join_msg)
if recv_msg.type == 'ok':
token = recv_msg.token
except socket.gaierror:
print("ERROR: Server address invalid.")
except OSError:
print("ERROR: No connection.")
return sent, recv, token
def send_and_recv(sent, recv, msg_to_send):
"""Sends a message to the connected server and returns the server's response."""
sent.write(msg_to_send + '\r\n')
sent.flush()
resp = recv.readline()
recv_msg = ds_protocol.extract_json(resp)
if recv_msg.message:
print(recv_msg.message)
return recv_msg