-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTODO.txt
140 lines (94 loc) · 6.96 KB
/
TODO.txt
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
# 개발할 기능들
## 코드 최적화
1. 버퍼로 사용중인 std::string을 std::vector<std::byte>로 변경하기
2. const string& 이나 string_view로 바꿀 수 있는 것들 찾아서 모두 바꾸기
3. 람다에서 사라질 변수들 참조로 받던거 복사로 변경
4. json 불필요하게 base64 변환하던거 수정
## DB
1. 연락처 - 완료
## Server
1. 로그인 - 완료
2. 채팅방 초기화 - 완료
3. text 메시지 처리 - 완료
4. img 메시지 처리, 이모티콘
5. 채팅방 생성
6. 연락처 추가(친구 추가)
7. 채팅방 나가기
8. 채팅방 전환시 내용 긁어오기
9. 채팅 기록 검색
## Client
### UI
1. 로그인 화면 - 70%
2. Text 챗 버블 - 완료
3. Img 챗 버블
4. 채팅방 화면
5. 연락처 화면(친구 추가 알림도 있어야 함)
6. 채팅방 나가기
7. 채팅방 taskbar에 알림 띄우기 (QApplication::alert(), QApplication::notify(), 혹은 qml의 Notification 객체 이용할 듯?)
8. 채팅방 전환시 내용 긁어오기
9. 채팅 기록 검색
10. layout들 중 필요한건 splitterview로 변경할 것
특정 c++ 구조체 qml로 넘길때 Q_DECLARE_METATYPE 사용
Qt6에서는 QtGraphicalEffects를 qml에서 import할 수 없기에 Qt5Compat.GraphicalEffects로 대체해야됨
import가 바뀌었기에 cmake 포함 모듈도 밑과 같이 바꿔야됨
find_package(Qt6 COMPONENTS Core5Compat REQUIRED)
target_link_libraries(mytarget PUBLIC Qt6::Core5Compat)
c++로 특정 모델 만들고 qml과 연동하기
https://stackoverflow.com/questions/48534529/how-to-populate-listview-with-qstringlist
https://makersweb.net/qt/14619
단어 자동 완성, 리스트뷰 filter에 관한 글들
https://stackoverflow.com/questions/28499676/how-to-search-for-and-select-items-from-a-qlistview
QSortFilterProxyModel -> listview search, filter 기능
https://kunalmaemo.blogspot.com/2013/04/creating-qml-listview-with-search.html
https://www.youtube.com/watch?v=6oQuxhDsv20&ab_channel=KunalParmar -> demo from listview filter
한글자 칠 때마다 검색 내용 동적으로 변하는 거 -> incremental search, find as you type(FAYT), spell checker, dfs/bfs/trie
https://ialy1595.github.io/post/korean-incremental-search/
- 테스트 경로
db에 유저 4개 정도 추가 -> tongstar로 회원가입해서 유저 추가[trySignUp 검사 O] -> 로그인[tryLogin 검사 O] -> 친구 추가[tryAddContact O 검사] -> 세션 만들기(한 3개 정도)[tryAddSession 검사 O] -> 특정 세션에서 대화[trySendTextChat 검사 O] -> 대화 중이지 않은 세션에서 메시지 갱신 되는지 확인 -> 다른 세션 입장시 채팅방 갱신 여부
-- 메시지 받는 기능 테스트 경로
세션 보유를 많이하고 있는 유저로 로그인 -> 해당 유저의 세션 읽어들이는 로직 트리거 [tryInitSessionList 검사] -> 특정 유저가 해당 유저로 메시지를 보냄 -> 해당 유저 클라이언트에서 그 메시지가 속한 세션 갱신[RecieveTextChat 검사]
-- 메시지 읽은 사람 갱신 루트
특정 사용자가 메시지 보냄(trySendChat) -> 서버에서 메시지 뿌림(ChatHandling: 해당 함수에서 뿌릴 때 람다 함수에 특정 로직 박아야됨) -> 다른 사용자가 메시지 받음(RecieveChat 특정 조건에 의해서 메시지 읽었다는 정보를 서버에 보냄) -> 서버에서 해당 정보 받고 모든 사용자의 메시지 읽음 유무를 획득하고 취합해서 클라이언트에 전달해야 함(ChatHandling)
세션 보유를 많이하고 있는 유저로 로그인 -> 해당 유저의 세션 읽어들이는 로직 트리거 [tryInitSessionList 검사] -> 특정 세션을 클릭하여 접속[tryRefreshSession 검사]
topwindow인지 검사하고 있는 함수가 있어야 됨 ex) activate window
클라에서 메시지 받을 때 topwindow인지 검사, topwindow가 세션 안읽은 메시지 +1 처리
우선적으로 해야 하는 것: session, sessionmodel, chat, chatmodel 관련 로직들 구축 -> 일단 함
채팅 보내는 함수들 구조 다시 변경해야 함, qml 소통 방식 바뀜
tryRefreshSession을 하면 reader_id 갱신을 위해 해당 세션에 참가한 사용자들 한테도 알려야 함 (RefreshReaderIds)
- 알림 처리
https://het.as.utexas.edu/HET/Software/html/declarative-modelviews-webview-alerts-qml-alerts-alerts-qml.html -> 참고
https://gist.github.com/Siecje/13f0a3725cf4b6765b86f3b54b15b1fc -> 참고
alert 함수를 이용할 수도 있고 qml 다이얼로그를 변형하여 접근할 수도 있음
- 고쳐야할 문제
1. 다른 컴퓨터에서 접속 안됨 -> server ip가 로컬 호스트로 되어있어서 그럼
2. 채팅 정렬 안됨, hasStem 값 관련 오류
3. 가상 머신에서 채팅 보내거나 받는 경우 이미지가 안보임 -> 이미지 읽는 경로에 한글이 들어가면 바로 문제 생겨서 그럼
해당 문제에 대한 해결법은 https://wiki.qt.io/Strings_and_encodings_in_Qt/ko 를 참고하면 알 수 있다.
QString은 기본적으로 utf-16이라고 보면 된다.
즉 wstring으로 변환이 자연스럽다.
QString에 넣는 경우에는 무조건 utf8 인코딩 시켜서 넣거나 std::wstring을 넣을 것
std::string이나 const char*를 그대로 박아버리고 싶다면 QByteArray를 이용해야 함
클라에서 서버로 QString 넣어 보내는 경우도 따져줘야함..., += 기호 다 봐야함
클라 QString <-> NetworkBuffer(UTF-8) <-> UTF-8 std::string
4. 인코딩 방식 하나 정해라....
서버와의 통신은 무조건 raw data가 아니라면 utf-8 인코딩한 상태로 보내라, json 주고 받을 때는 인코딩 없이 하되 json 내부 스트링은 인코딩해라
5. 스레드 경합이 발생할 수 있는 부분은 모두 gui의 invokemethod를 통하여 수행한다.
=> session_view 사용할 때 세션을 지우는 경우 사용하고 있던 session_view는 어떻게 처리할 것인가?
deleted 배열 따로 만들고 크기가 50개 차면 앞에서 부터 25개씩 지우는 방식으로 수행
6. 모든 qml 함수 main_page로 이동
7. Utf8ToStr -> Utf8ToANSI / boost::dll::program_location().parent_path().string() -> QDir::currentPath()
std::filesystem::path, std::ifstream, std::ofstream
boost::filesystem -> std::filesystem
- 아직 남은 기능
1. 채팅 더 불러오기 -> done
2. 친구 삭제 -> done
3. 채팅 검색
4. 세션 나가기 -> done
5. 유저 이름 or 이미지 바꾸는 경우
6. 채팅방 추방, 초대
7. login id db 구조 바꾸기
세션을 나갈때 세션을 나갔습니다 채팅을 뿌려야됨, 세션 나간 사용자는 현재 세션 스택을 비워야됨
trySignUp, executeFileDialog 다루는 곳 qvm 인자만 소문자임...
시간 정보, 누구 들어온 정보 추방된 정보도 그냥 서버 채팅 로그에 남겨버리는 방식으로 변경해야 됨 (예전 소수점을 이용한 방식은 폐기)
설치하는 것도 알려주면 좋다.
DB 특정 유저 ID, 비번, 해당 계정이 권한 있는 DB 이름 정도만 사용자가 입력하면 됨 (서버쪽은...)