-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient_storage.py
More file actions
161 lines (136 loc) · 5.73 KB
/
client_storage.py
File metadata and controls
161 lines (136 loc) · 5.73 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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
from sqlalchemy import MetaData, Table, Column, Integer, String, create_engine, ForeignKey, DateTime
from sqlalchemy.orm import mapper, sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
import sqlite3
from datetime import datetime
from datetime import timedelta
Base = declarative_base()
class ClientStorage():
class Contact(Base):
__tablename__ = 'Contacts'
id = Column(Integer, primary_key=True)
name = Column(String)
def __init__(self, name):
self.name = name
self.id = None
def __repr__(self):
return f'{self.id} - {self.name}'
class MyKey(Base):
__tablename__ = 'Keys'
id = Column(Integer, primary_key=True)
private_key = Column(String)
public_key = Column(String)
def __init__(self, private_key,public_key):
self.private_key = private_key
self.public_key = public_key
def __repr__(self):
return f'{self.private_key} - {self.public_key}'
class Message(Base):
__tablename__ = 'Messages'
id = Column(Integer, primary_key=True)
contact_id = Column(Integer, ForeignKey('Contacts.id'))
text = Column(String)
status = Column(String)
date_time = Column(DateTime)
Contact = relationship('Contact', back_populates='Messages')
def __init__(self, contact_id, text, status):
self.id = None
self.contact_id = contact_id
self.text = text
self.status = status
self.date_time = datetime.now()
def __repr__(self):
return f'{self.id}: {self.status} {self.contact_id} - {self.text} ({self.date_time})'
def __init__(self, akk_name):
"""
Получаем имя пользователя и добавляем в имя базы, что бы
была возможность запускать несколько клиентов на одной машине
:param akk_name:
"""
self.akk_name = akk_name
self.Contact.Messages = relationship('Message', back_populates="Contact")
engine = create_engine(f'sqlite:///client_db_{self.akk_name}.db3?check_same_thread=False')
Session = sessionmaker(bind=engine)
Base.metadata.create_all(engine)
self.session = Session()
def add_contact(self, user_name):
user = self.session.query(self.Contact).filter_by(name=user_name).first()
if user:
print('Пользователь уже есть в контат листе')
else:
user = self.Contact(user_name)
self.session.add(user)
self.session.commit()
print(f'Пользователь {user_name} добавлен в локальный контакт лист')
def del_contact(self, user_name):
user = self.session.query(self.Contact).filter_by(name=user_name).first()
if user:
self.session.delete(user)
self.session.commit()
print(f'Пользователь {user_name} удалён из локального контакт листа')
else:
print('Пользователя с таким именем нет в локальном контакт листе')
def add_message(self, user_name, text, status):
"""
Ищем пользователя в контакт листе, если его нет то добавляем в контакт лист
потом добавляем сообщение.
:param user_name:
:param text:
:param status: str sent or received
:return:
"""
user = self.session.query(self.Contact).filter_by(name=user_name).first()
if user:
message = self.Message(user.id, text, status)
self.session.add(message)
self.session.commit()
else:
self.add_contact(user_name)
self.add_message(user_name, text, status)
def get_contacts(self):
users = self.session.query(self.Contact).all()
return users
def get_history(self, user_name, day=1):
"""
возвращает список obj сообщений с юзером. По умолчанию за последние сутки.
:param day:
:param user_name: str
:return: list
"""
user = self.session.query(self.Contact).filter_by(name=user_name).first()
if not day == 'all':
limit = datetime.now() - timedelta(days=day)
messages = self.session.query(self.Message).filter(self.Message.contact_id == user.id,
self.Message.date_time > limit).order_by(
self.Message.date_time).all()
else:
messages = self.session.query(self.Message).all()
return messages
def get_keys(self):
'''
Запрашивае ключи, если их нет то возвразаем False
:return:
'''
keys = self.session.query(self.MyKey).first()
if keys:
return keys
else:
return False
def add_keys(self,private_key,public_key):
"""
Добавляем ключи
:param private_key:
:param public_key:
:return:
"""
keys = self.MyKey(private_key,public_key)
self.session.add(keys)
self.session.commit()
def main():
client = ClientStorage('User-1')
client.add_message('User-7', 'Привет go', 'sent')
client.add_message('User-7', 'Привет сам', 'received')
print(client.get_contacts())
print(client.get_history('User-7'))
if __name__ == '__main__':
main()