forked from KImMyoungSoo/chattingApp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
160 lines (141 loc) · 5.49 KB
/
app.py
File metadata and controls
160 lines (141 loc) · 5.49 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
# _*_ coding: utf-8 _*_
from flask import Flask, render_template, session, request, redirect
from flask_socketio import SocketIO, emit
import sqlite3
app = Flask(__name__)
app.secret_key = "super secret key"
socketio = SocketIO(app)
DATABASE = 'test.db'
#db functions
def init_db():
db = sqlite3.connect("test.db")
cur = db.cursor()
cur.execute("SELECT count(name) FROM sqlite_master WHERE type='table';")
tb_lst = cur.fetchone()[0]
if(tb_lst == 0):
print("> created DB")
cur.execute("CREATE TABLE user(id INTEGER PRIMARY KEY AUTOINCREMENT, userid VARCHAR(12) NOT NULL, pwd TEXT NOT NULL, email TEXT NOT NULL, username TEXT);")
cur.execute("CREATE TABLE L_log(id INTEGER PRIMARY KEY AUTOINCREMENT, userid VARCHAR(12), real_nm VARCHAR(12), room_name TEXT NOT NULL, message TEXT NOT NULL, ts TIMESTAMP DEFAULT (datetime('now','localtime')));")
cur.execute("CREATE TABLE P_log(id INTEGER PRIMARY KEY AUTOINCREMENT, s_user VARCHAR(12), r_user VARCHAR(12), message TEXT NOT NULL, ts TIMESTAMP DEFAULT(datetime('now','localtime')));")
'''
@TODO : 채팅방 채팅로그등 기능구현에 필요한 테이블 추가 생성
'''
db.commit()
cur.close()
db.close()
@app.route('/')
def index():
if session.get("account_id") is not None:
return render_template('rooms.html')
else :
return render_template('login.html')
# login function
@app.route('/account/login', methods=["POST"])
def login():
db = sqlite3.connect("test.db")
cur = db.cursor()
user_id = request.form["user_id"]
user_pw = request.form["user_pw"]
cur.execute("SELECT EXISTS (SELECT * FROM user WHERE userid = ? AND pwd = ?);", (user_id, user_pw))
flag = cur.fetchone()[0]
if flag == 1:
session["account_id"] = user_id
cur.execute("SELECT username FROM user WHERE userid = ?;", [user_id])
session["user_id"] = cur.fetchone()
print('> session : ' + session['account_id'])
return redirect('/', code=302)
else:
return redirect('/', code=302)
@app.route('/account/signup', methods=["GET"])
def signup():
return render_template("signup.html")
@app.route('/account/create', methods=["POST"])
def create():
user_id = request.form["user_id"]
user_pw = request.form["user_pw"]
user_em = request.form["user_email"]
user_name = request.form["user_name"]
db = sqlite3.connect('test.db')
cur = db.cursor()
cur.execute("INSERT INTO user(userid, pwd, email, username) VALUES(?, ?, ?, ?)", (user_id, user_pw, user_em, user_name))
db.commit()
cur.close()
db.close()
return redirect('/', code=302)
@app.route('/room1')
def rooms1():
session['room'] = 'room1'
print(">>> room session : " + session['room'])
return render_template('index.html')
@app.route('/room2')
def rooms2():
session['room'] = 'room2'
print(">>> room session : " + session['room'])
return render_template('index.html')
@app.route('/room3')
def rooms3():
session['room'] = 'room3'
print(">>> room session : " + session['room'])
return render_template('index.html')
#Socketio Part
#connecting
@socketio.on('connect', namespace='/chat')
def connect():
print("Connected ...")
#처음 채팅방에 들어왔을때
@socketio.on('first', namespace='/chat')
def test(data):
db = sqlite3.connect("test.db")
cur = db.cursor()
print(data)
# print('-----------------')
# account = session['account_id']
# print(account)
# print('-----------------')
sess = str(session['user_id'])
sess = sess[2:-3]
print(sess)
mes = sess + " 님 께서 입장하셨습니다."
cur.execute("SELECT real_nm, room_name, message FROM L_log WHERE room_name=? ORDER BY id DESC LIMIT 100",(session['room'],))
last_message = cur.fetchall()
for ms in last_message:
username, roomname, msg = ms
emit('makechat',{'room': session['room'], 'type': 'message', 'name': username, 'message': msg})
print(ms)
'''
@TODO : 기존의 로그를 불러올 수 있어야 함 모든 로그를 불러오면 많을수 있으므로 가장 최신의 몇개정도를 불러오는게 좋을듯 함
'''
db.commit()
cur.close()
db.close()
emit('makechat',{'room': session['room'], 'type': 'connect', 'name': 'SERVER', 'message': mes} , broadcast = True)
# 유저가 입력한 message를 모두에게 전송
@socketio.on('message', namespace='/chat')
def message(data):
db = sqlite3.connect("test.db")
cur = db.cursor()
print(data)
ty = data['type']
msg = data['message']
sess = str(session['user_id'])
sess = sess[2:-3] # sess => user name
account = session['account_id'] # account => userid
roomname = session['room']
cur.execute("INSERT INTO L_log(userid, real_nm, message, room_name) VALUES(?, ?, ?, ?);",(account, sess, msg,roomname))
db.commit()
cur.close()
db.close()
'''
@TODO : 채팅방 로그 생성 즉 데이터를 디비에 추가
'''
emit('makechat',{'room': session['room'], 'type': ty, 'name': sess, 'message': msg}, broadcast = True, include_self=False)
@socketio.on('disconnect', namespace='/chat')
def disconnect():
sess = str(session['user_id'])
sess = sess[2:-3]
mes = sess + " 님 께서 퇴장하셨습니다."
emit('makechat',{'room': session['room'], 'type': 'disconnect', 'name': 'SERVER', 'message': mes}, broadcast = True, include_self=False)
#app start
if __name__ == '__main__':
init_db()
socketio.run(app, port=9001, debug=True)