Просмотр исходного кода

실수로 너무 많이 갈아엎어버렸다... 아 이게 아닌데...

잉여개발기 (SPDV) 2 лет назад
Родитель
Сommit
ae5166ffba

+ 8 - 6
app.py

@@ -671,8 +671,8 @@ app.route('/bbs/edit/<int:bbs_num>/<int:post_num>/<comment_num>', methods = ['PO
 app.route('/bbs/delete/<int:bbs_num>/<int:post_num>/<comment_num>', methods = ['POST', 'GET'])(bbs_w_delete)
 
 # Func-api
-# app.route('/api/render_tool/<tool>/<everything:name>', methods = ['POST'])(api_w_render)
-# app.route('/api/render_tool/<tool>', methods = ['POST'])(api_w_render)
+app.route('/api/render_tool/<tool>/<data_in>', methods = ['POST'])(api_w_render)
+app.route('/api/render_tool/<tool>', methods = ['POST'])(api_w_render)
 app.route('/api/render/<everything:name>', methods = ['POST'])(api_w_render)
 app.route('/api/render', methods = ['POST'])(api_w_render)
 
@@ -692,16 +692,16 @@ app.route('/api/skin_info/<name>')(api_skin_info)
 app.route('/api/user_info/<user_name>')(api_user_info)
 app.route('/api/setting/<name>')(api_setting)
 
-app.route('/api/thread/<int:topic_num>/<tool>/<int:num>/<render>')(api_topic)
-app.route('/api/thread/<int:topic_num>/<tool>/<int:num>')(api_topic)
-app.route('/api/thread/<int:topic_num>/<tool>')(api_topic)
-app.route('/api/thread/<int:topic_num>')(api_topic)
+app.route('/api/thread/<int:topic_num>/<int:s_num>/<int:e_num>', defaults = { 'db_set' : db_set_str })(api_topic)
+app.route('/api/thread/<int:topic_num>/<tool>', defaults = { 'db_set' : db_set_str })(api_topic)
+app.route('/api/thread/<int:topic_num>', defaults = { 'db_set' : db_set_str })(api_topic)
 
 app.route('/api/search/<everything:name>', defaults = { 'db_set' : db_set_str })(api_search)
 app.route('/api/search_page/<int:num>/<everything:name>', defaults = { 'db_set' : db_set_str })(api_search)
 app.route('/api/search_data/<everything:name>', defaults = { 'search_type' : 'data', 'db_set' : db_set_str })(api_search)
 app.route('/api/search_data_page/<int:num>/<everything:name>', defaults = { 'search_type' : 'data', 'db_set' : db_set_str })(api_search)
 
+# 곧 개편 당할 곳
 app.route('/api/recent_change/<int:num>')(api_recent_change)
 app.route('/api/recent_change')(api_recent_change)
 # recent_changes -> recent_change
@@ -710,9 +710,11 @@ app.route('/api/recent_changes')(api_recent_change)
 app.route('/api/recent_discuss/<get_type>/<int:num>')(api_recent_discuss)
 app.route('/api/recent_discuss/<int:num>')(api_recent_discuss)
 app.route('/api/recent_discuss')(api_recent_discuss)
+##
 
 app.route('/api/lang/<data>')(api_func_lang)
 app.route('/api/sha224/<everything:data>')(api_func_sha224)
+app.route('/api/ip/<everything:data>', defaults = { 'db_set' : db_set_str })(api_func_ip)
 
 app.route('/api/image/<everything:name>')(api_image_view)
 

+ 3 - 1
route/__init__.py

@@ -4,7 +4,6 @@ from route.api_recent_change import api_recent_change
 from route.api_recent_discuss import api_recent_discuss
 from route.api_setting import api_setting
 from route.api_skin_info import api_skin_info
-from route.api_topic import api_topic
 from route.api_user_info import api_user_info
 from route.api_version import api_version
 from route.api_w_render import api_w_render
@@ -170,9 +169,12 @@ from route.vote_list import vote_list
 from route.vote_select import vote_select
 
 from route.go_api_func_sha224 import api_func_sha224
+from route.go_api_func_ip import api_func_ip
 
 from route.go_api_search import api_search
 
+from route.go_api_topic import api_topic
+
 from route.go_api_w_raw import api_w_raw
 from route.go_api_w_random import api_w_random
 

+ 13 - 6
route/api_w_render.py

@@ -1,16 +1,23 @@
 from .tool.func import *
 
-def api_w_render(name = ''):
+def api_w_render(name = '', tool = '', data_in = ''):
     with get_db_connect() as conn:
         curs = conn.cursor()
 
         if flask.request.method == 'POST':
             data_org = flask.request.form.get('data', '')
-            data_pas = render_set(
-                doc_name = name, 
-                doc_data = data_org, 
-                data_type = 'api_view'
-            )
+            if tool == '':
+                data_pas = render_set(
+                    doc_name = name, 
+                    doc_data = data_org, 
+                    data_type = 'api_view'
+                )
+            else:
+                data_pas = render_set(
+                    doc_data = data_org, 
+                    data_type = 'api_thread',
+                    data_in = data_in
+                )
 
             return flask.jsonify({
                 "data" : data_pas[0], 

+ 1 - 1
route/bbs_w_post.py

@@ -2,7 +2,7 @@ from .tool.func import *
 
 from .api_bbs_w_post import api_bbs_w_post
 from .api_bbs_w_comment import api_bbs_w_comment
-from .api_topic import api_topic_thread_make, api_topic_thread_pre_render
+from .go_api_topic import api_topic_thread_make, api_topic_thread_pre_render
 
 from .edit import edit_editor
 

+ 21 - 3
route/edit_move.py

@@ -77,7 +77,13 @@ def edit_move(name):
                         curs.execute(db_change("update rc set title = ?, id = ? where title = ? and id = ?"), [move_title, str(int(num) + int(move[0])), name, move[0]])
                         curs.execute(db_change("update history set title = ?, id = ? where title = ? and id = ?"), [move_title, str(int(num) + int(move[0])), name, move[0]])
 
-                    history_plus(move_title, data_in, time, ip, send, '0',
+                    history_plus(
+                        move_title, 
+                        data_in, 
+                        time, 
+                        ip, 
+                        send, 
+                        '0',
                         t_check = 'merge <a>' + name + '</a> - <a>' + move_title + '</a> move',
                         mode = 'move'
                     )
@@ -107,7 +113,13 @@ def edit_move(name):
                         data = curs.fetchall()
                         data_in = data[0][0] if data else ''
 
-                        history_plus(title_name[0], data_in, time, ip, send, '0',
+                        history_plus(
+                            title_name[0], 
+                            data_in, 
+                            time, 
+                            ip, 
+                            send, 
+                            '0',
                             t_check = '<a>' + title_name[0] + '</a> - <a>' + title_name[1] + '</a> move',
                             mode = 'move'
                         )
@@ -134,7 +146,13 @@ def edit_move(name):
                 curs.execute(db_change("update rc set title = ? where title = ?"), [move_title, name])
                 # 역사와 최근 변경 이동 E
 
-                history_plus(move_title, data_in, time, ip, send, '0',
+                history_plus(
+                    move_title, 
+                    data_in, 
+                    time, 
+                    ip, 
+                    send,
+                    '0',
                     t_check = '<a>' + name + '</a> - <a>' + move_title + '</a> move',
                     mode = 'move'
                 )

+ 3 - 3
route/edit_request.py

@@ -41,12 +41,12 @@ def edit_request(name = 'Test', do_type = ''):
             if acl_check(name, 'document_edit') == 1:
                 return redirect('/w/' + url_pas(name))
             
-            curs.execute(db_change("delete from data where title = ?"), [name])
-            curs.execute(db_change("insert into data (title, data) values (?, ?)"), [name, edit_request_data])
-    
             curs.execute(db_change("select user from scan where title = ? and type = ''"), [name])
             for scan_user in curs.fetchall():
                 add_alarm(scan_user[0], edit_request_user, '<a href="/w/' + url_pas(name) + '">' + html.escape(name) + '</a>')
+
+            curs.execute(db_change("delete from data where title = ?"), [name])
+            curs.execute(db_change("insert into data (title, data) values (?, ?)"), [name, edit_request_data])
                     
             history_plus(
                 name,

+ 23 - 0
route/go_api_func_ip.py

@@ -0,0 +1,23 @@
+from .tool.func import *
+
+def api_func_ip(db_set, data = 'Test'):
+    with get_db_connect() as conn:
+        other_set = {}
+        other_set["data"] = data
+        other_set["ip"] = ip_check()
+        other_set = json.dumps(other_set)
+
+        if platform.system() == 'Linux':
+            if platform.machine() in ["AMD64", "x86_64"]:
+                data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.amd64.bin"), sys._getframe().f_code.co_name, db_set, data], stdout = subprocess.PIPE).communicate()[0]
+            else:
+                data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.arm64.bin"), sys._getframe().f_code.co_name, db_set, data], stdout = subprocess.PIPE).communicate()[0]
+        else:
+            if platform.machine() in ["AMD64", "x86_64"]:
+                data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.amd64.exe"), sys._getframe().f_code.co_name, db_set, data], stdout = subprocess.PIPE).communicate()[0]
+            else:
+                data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.arm64.exe"), sys._getframe().f_code.co_name, db_set, data], stdout = subprocess.PIPE).communicate()[0]
+
+        data = data.decode('utf8')
+
+        return flask.Response(response = data, status = 200, mimetype = 'application/json')

+ 0 - 2
route/go_api_search.py

@@ -2,8 +2,6 @@ from .tool.func import *
 
 def api_search(db_set, name = 'Test', search_type = 'title', num = 1):
     with get_db_connect() as conn:
-        curs = conn.cursor()
-
         other_set = {}
         other_set["name"] = name
         other_set["search_type"] = search_type

+ 20 - 91
route/api_topic.py → route/go_api_topic.py

@@ -119,103 +119,32 @@ def api_topic_thread_pre_render(curs, data, num, ip, topic_num = '', name = '',
 
     return data
 
-def api_topic(topic_num = 1, tool = 'normal', num = '', render = ''):
+def api_topic(db_set, topic_num = 1, tool = 'normal', s_num = '', e_num = ''):
     with get_db_connect() as conn:
-        curs = conn.cursor()
-
         topic_num = str(topic_num)
 
+        other_set = {}
+        other_set["topic_num"] = topic_num
+        other_set["tool"] = tool
+        other_set["s_num"] = str(s_num)
+        other_set["e_num"] = str(e_num)
+        other_set["ip"] = ip_check()
+        other_set = json.dumps(other_set)
+
         if acl_check('', 'topic_view', topic_num) != 1:
-            if tool == 'normal':
-                if num != '':
-                    curs.execute(db_change("select id, data, date, ip, block, top from topic where code = ? and id + 0 = ? + 0 order by id + 0 asc"), [topic_num, num])
+            if platform.system() == 'Linux':
+                if platform.machine() in ["AMD64", "x86_64"]:
+                    data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.amd64.bin"), sys._getframe().f_code.co_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
                 else:
-                    curs.execute(db_change("select id, data, date, ip, block, top from topic where code = ? order by id + 0 asc"), [topic_num])
-            elif tool == 'top':
-                curs.execute(db_change("select id, data, date, ip, block, top from topic where code = ? and top = 'O' order by id + 0 asc"), [topic_num])
+                    data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.arm64.bin"), sys._getframe().f_code.co_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
             else:
-                # tool == 'length'
-                curs.execute(db_change("select id from topic where code = ? order by id + 0 desc limit 1"), [topic_num])
-                db_data = curs.fetchall()
-                if db_data:
-                    return flask.jsonify({ 'length' : db_data[0][0] })
-                else:
-                    return flask.jsonify({})
-
-            data = curs.fetchall()
-            if data:
-                data_a = {}
-                admin = admin_check(3)
-
-                curs.execute(db_change("select ip from topic where code = ? order by id + 0 asc limit 1"), [topic_num])
-                data_f = curs.fetchall()
-                data_f = data_f[0][0] if data_f else ''
-                data_a['data_main'] = {
-                    "ip_first" : ip_pas(data_f, 1),
-                    "admin" : str(admin)
-                }
-                data_a['data'] = []
-
-                ip_a = ip_pas([i[3] for i in data])
-                ip_a_2 = ip_pas([i[3] for i in data], 1)
-                for i in data:
-                    data_v = i[1] if i[4] != 'O' or admin == 1 else ''
-                    if data_v != '':
-                        data_v = render_set(
-                            doc_data = data_v, 
-                            data_type = 'api_thread',
-                            data_in = 'topic_' + topic_num + '_' + i[0]
-                        )
-                    else:
-                        data_v = ['', '']
-
-                    data_a['data'] += [{
-                        "id" : i[0],
-
-                        "data" : data_v,
-                        "date" : i[2],
-                        "ip" : ip_a_2[i[3]],
-                        "blind" : i[4],
-
-                        "ip_pas" : ip_a[i[3]],
-                        "data_pas" : data_v
-                    }]
-
-                if render == '':
-                    return flask.jsonify(data_a)
+                if platform.machine() in ["AMD64", "x86_64"]:
+                    data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.amd64.exe"), sys._getframe().f_code.co_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
                 else:
-                    data_r = ''
-                    if 'data' in data_a:
-                        for for_a in data_a['data']:
-                            if tool == 'top':
-                                color = 'red'
-                            elif for_a["blind"] == '1':
-                                color = 'blue'
-                            elif data_a['data_main']["ip_first"] == for_a["ip"]:
-                                color = 'green'
-                            else:
-                                color = 'default'
-
-                            data_r += api_topic_thread_make(
-                                for_a["ip_pas"],
-                                '<a href="/thread/' + topic_num + '/comment/' + for_a["id"] + '/tool">(' + load_lang('tool') + ')</a> ' + for_a["date"],
-                                for_a["data_pas"][0] + '<script>' + for_a["data_pas"][1] + '</script>',
-                                for_a["id"],
-                                color = color,
-                                blind = for_a["blind"],
-                                add_style = '',
-                                admin_check = admin if tool == 'normal' else 0,
-                                topic_num = topic_num
-                            )
-
-                    if admin == 1 and tool == 'normal':
-                        data_r += '''
-                            <a href="javascript:opennamu_thread_blind();">(''' + load_lang('hide') + ''' | ''' + load_lang('hide_release') + ''')</a>
-                            <hr class="main_hr">
-                        '''
-
-                    return flask.jsonify({ "data" : data_r })
-            else:
-                return flask.jsonify({})
+                    data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.arm64.exe"), sys._getframe().f_code.co_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
+
+            data = data.decode('utf8')
+
+            return flask.Response(response = data, status = 200, mimetype = 'application/json')
         else:
             return flask.jsonify({})

+ 10 - 14
route/topic.py

@@ -1,6 +1,6 @@
 from .tool.func import *
 
-from .api_topic import api_topic, api_topic_thread_pre_render
+from .go_api_topic import api_topic, api_topic_thread_pre_render
 
 from .edit import edit_editor
 
@@ -128,14 +128,6 @@ def topic(topic_num = 0, do_type = '', doc_name = 'Test'):
             
             shortcut += '</div>'
 
-            top_topic = ''
-            json_data = json.loads(api_topic(int(topic_num), 'top', '', 'render').data)
-            top_topic += json_data['data'] if 'data' in json_data else ''
-            
-            main_topic = ''
-            json_data = json.loads(api_topic(int(topic_num), 'normal', '', 'render').data)
-            main_topic += json_data['data'] if 'data' in json_data else ''
-
             return easy_minify(flask.render_template(skin_check(),
                 imp = [name, wiki_set(), wiki_custom(), wiki_css(['(' + load_lang('discussion') + ')', 0])],
                 data = '''
@@ -150,11 +142,15 @@ def topic(topic_num = 0, do_type = '', doc_name = 'Test'):
                     ''' + shortcut + '''
                     <h2 id="topic_top_title">''' + html.escape(sub) + '''</h2>
                     
-                    <div id="top_topic">''' + top_topic + '''</div>
-                    <div id="main_topic">''' + main_topic + '''</div>
-                    <div id="plus_topic"></div>
-                    <script>opennamu_thread_where();</script>
-
+                    <div id="opennamu_top_thread"></div>
+                    <div id="opennamu_main_thread"></div>
+                    <div id="opennamu_reload_thread"></div>
+                    <script>
+                        opennamu_get_thread("''' + topic_num + '''", "top");
+                        opennamu_get_thread("''' + topic_num + '''");
+                    </script>
+
+                    <a href="javascript:opennamu_thread_blind();">(''' + load_lang('hide') + ''' | ''' + load_lang('hide_release') + ''')</a>
                     <a href="/thread/''' + topic_num + '/tool">(' + load_lang('topic_tool') + ''')</a>
                     <hr class="main_hr">
                     

+ 0 - 13
route/topic_list.py

@@ -1,7 +1,5 @@
 from .tool.func import *
 
-from .api_topic import api_topic
-
 def topic_list(name = 'Test'):
     with get_db_connect() as conn:
         curs = conn.cursor()
@@ -34,19 +32,8 @@ def topic_list(name = 'Test'):
             curs.execute(db_change("select code, sub from rd where title = ? and stop != 'O' order by date desc"), [name])
 
         for data in curs.fetchall():
-            curs.execute(db_change("select id from topic where code = ? order by id + 0 desc limit 1"), [data[0]])
-            db_data = curs.fetchall()
-            last_thread = db_data[0][0] if db_data else '1'
-
             div += '<h2><a href="/thread/' + data[0] + '">' + data[0] + '. ' + html.escape(data[1]) + '</a></h2>'
 
-            first_data = json.loads(api_topic(data[0], 'normal', 1, 'render').data)
-            div += first_data['data'] if 'data' in first_data else ''
-
-            if last_thread != '1':
-                last_data = json.loads(api_topic(data[0], 'normal', int(last_thread), 'render').data)
-                div += last_data['data'] if 'data' in last_data else ''
-
         if div == '':
             plus = re.sub(r'^<br>', '', plus)
 

BIN
route_go/bin/main.amd64.bin


BIN
route_go/bin/main.amd64.exe


BIN
route_go/bin/main.arm64.bin


BIN
route_go/bin/main.arm64.exe


+ 4 - 0
route_go/main.go

@@ -18,5 +18,9 @@ func main() {
 		route.Api_w_random(call_arg[1:])
 	} else if call_arg[0] == "api_search" {
 		route.Api_search(call_arg[1:])
+	} else if call_arg[0] == "api_topic" {
+		route.Api_thread(call_arg[1:])
+	} else if call_arg[0] == "api_func_ip" {
+		route.Api_func_ip(call_arg[1:])
 	}
 }

+ 24 - 0
route_go/route/api_func_ip.go

@@ -0,0 +1,24 @@
+package route
+
+import (
+	"encoding/json"
+	"fmt"
+
+	"opennamu/route/tool"
+)
+
+func Api_func_ip(call_arg []string) {
+	db_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &db_set)
+
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[1]), &other_set)
+
+	ip_data := tool.IP_parser(db_set, other_set["data"], other_set["ip"])
+
+	new_data := map[string]string{}
+	new_data["data"] = ip_data
+
+	json_data, _ := json.Marshal(new_data)
+	fmt.Print(string(json_data))
+}

+ 3 - 6
route_go/route/api_func_sha224.go

@@ -1,19 +1,16 @@
 package route
 
 import (
-	"crypto/sha256"
-	"encoding/hex"
 	"encoding/json"
 	"fmt"
+
+	"opennamu/route/tool"
 )
 
 func Api_func_sha224(call_arg []string) {
 	data := call_arg[0]
 
-	hasher := sha256.New224()
-	hasher.Write([]byte(data))
-	hash_byte := hasher.Sum(nil)
-	hash_str := hex.EncodeToString(hash_byte)
+	hash_str := tool.Sha224(data)
 
 	new_data := map[string]string{}
 	new_data["data"] = hash_str

+ 123 - 0
route_go/route/api_thread.go

@@ -0,0 +1,123 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"fmt"
+
+	"opennamu/route/tool"
+)
+
+func Api_thread(call_arg []string) {
+	db_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &db_set)
+
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[1]), &other_set)
+
+	db := tool.DB_connect(db_set)
+	if db == nil {
+		return
+	}
+	defer db.Close()
+
+	if other_set["tool"] == "length" {
+		stmt, err := db.Prepare(tool.DB_change(db_set, "select id from topic where code = ? order by id + 0 desc limit 1"))
+		if err != nil {
+			return
+		}
+		defer stmt.Close()
+
+		var length string
+		err = stmt.QueryRow(other_set["topic_num"]).Scan(&length)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				length = "0"
+			} else {
+				return
+			}
+		}
+
+		new_data := map[string]string{}
+		new_data["length"] = length
+
+		json_data, _ := json.Marshal(new_data)
+		fmt.Print(string(json_data))
+	} else {
+		var rows *sql.Rows
+
+		if other_set["tool"] == "top" {
+			stmt, err := db.Prepare(tool.DB_change(db_set, "select id, data, date, ip, block, top from topic where code = ? and top = 'O' order by id + 0 asc"))
+			if err != nil {
+				return
+			}
+			defer stmt.Close()
+
+			rows, err = stmt.Query(other_set["topic_num"])
+			if err != nil {
+				return
+			}
+		} else {
+			if other_set["s_num"] != "" && other_set["e_num"] != "" {
+				stmt, err := db.Prepare(tool.DB_change(db_set, "select id, data, date, ip, block, top from topic where code = ? and ? + 0 <= id + 0 and id + 0 <= ? + 0 order by id + 0 asc"))
+				if err != nil {
+					return
+				}
+				defer stmt.Close()
+
+				rows, err = stmt.Query(other_set["topic_num"], other_set["s_num"], other_set["e_num"])
+				if err != nil {
+					return
+				}
+			} else {
+				stmt, err := db.Prepare(tool.DB_change(db_set, "select id, data, date, ip, block, top from topic where code = ? order by id + 0 asc"))
+				if err != nil {
+					return
+				}
+				defer stmt.Close()
+
+				rows, err = stmt.Query(other_set["topic_num"])
+				if err != nil {
+					return
+				}
+			}
+		}
+		defer rows.Close()
+
+		var id, data, date, ip, block, top string
+		var data_list [][]string
+
+		for rows.Next() {
+			err := rows.Scan(&id, &data, &date, &ip, &block, &top)
+			if err != nil {
+				return
+			}
+
+			data_list = append(data_list, []string{id, data, date, ip, block, top})
+		}
+
+		new_data := map[string][]map[string]string{}
+		new_data["data"] = []map[string]string{}
+
+		admin_auth := tool.Get_admin_auth(db_set, other_set["ip"])
+
+		for for_a := 0; for_a < len(data_list); for_a++ {
+			data := ""
+			if data_list[for_a][4] != "O" || admin_auth != "" {
+				data = data_list[for_a][1]
+			}
+
+			new_data["data"] = append(new_data["data"], map[string]string{
+				"id":        data_list[for_a][0],
+				"data":      data,
+				"date":      data_list[for_a][2],
+				"ip":        tool.IP_preprocess(db_set, data_list[for_a][3], other_set["ip"])[0],
+				"ip_render": tool.IP_parser(db_set, data_list[for_a][3], other_set["ip"]),
+				"blind":     data_list[for_a][4],
+			})
+		}
+
+		json_data, _ := json.Marshal(new_data)
+		fmt.Print(string(json_data))
+	}
+}

+ 1 - 0
route_go/route/api_w_random.go

@@ -19,6 +19,7 @@ func Api_w_random(call_arg []string) {
 	defer db.Close()
 
 	var title string
+
 	err := db.QueryRow(tool.DB_change(db_set, "select title from data where title not like 'user:%' and title not like 'category:%' and title not like 'file:%' order by random() limit 1")).Scan(&title)
 	if err != nil {
 		if err == sql.ErrNoRows {

+ 250 - 0
route_go/route/tool/ip_parser.go

@@ -0,0 +1,250 @@
+package tool
+
+import (
+	"database/sql"
+	"regexp"
+	"strconv"
+)
+
+func IP_or_user(ip string) bool {
+	match, _ := regexp.MatchString("(\\.|:)", ip)
+	if match {
+		return true
+	} else {
+		return false
+	}
+}
+
+func Get_level(db_set map[string]string, ip string) []string {
+	db := DB_connect(db_set)
+	if db == nil {
+		return []string{"", "", ""}
+	}
+	defer db.Close()
+
+	var level string
+	var exp string
+	var max_exp string
+
+	stmt, err := db.Prepare(DB_change(db_set, "select data from user_set where id = ? and name = 'level'"))
+	if err != nil {
+		return []string{"", "", ""}
+	}
+	defer stmt.Close()
+
+	err = stmt.QueryRow(ip).Scan(&level)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			level = "0"
+		} else {
+			return []string{"", "", ""}
+		}
+	}
+
+	stmt, err = db.Prepare(DB_change(db_set, "select data from user_set where id = ? and name = 'experience'"))
+	if err != nil {
+		return []string{"", "", ""}
+	}
+	defer stmt.Close()
+
+	err = stmt.QueryRow(ip).Scan(&exp)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			exp = "0"
+		} else {
+			return []string{"", "", ""}
+		}
+	}
+
+	level_int, _ := strconv.Atoi(level)
+	max_exp = strconv.Itoa(level_int*50 + 500)
+
+	return []string{level, exp, max_exp}
+}
+
+func Get_admin_auth(db_set map[string]string, ip string) string {
+	db := DB_connect(db_set)
+	if db == nil {
+		return ""
+	}
+	defer db.Close()
+
+	if !IP_or_user(ip) {
+		var auth string
+
+		stmt, err := db.Prepare(DB_change(db_set, "select data from user_set where id = ? and name = 'acl'"))
+		if err != nil {
+			return ""
+		}
+		defer stmt.Close()
+
+		err = stmt.QueryRow(ip).Scan(&auth)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				auth = "user"
+			} else {
+				return ""
+			}
+		}
+
+		if auth != "user" {
+			return auth
+		} else {
+			return ""
+		}
+	}
+
+	return ""
+}
+
+func IP_preprocess(db_set map[string]string, ip string, my_ip string) []string {
+	db := DB_connect(db_set)
+	if db == nil {
+		return []string{"", ""}
+	}
+	defer db.Close()
+
+	var ip_view string
+	var user_name_view string
+
+	err := db.QueryRow(DB_change(db_set, "select data from other where name = 'ip_view'")).Scan(&ip_view)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			ip_view = ""
+		} else {
+			return []string{"", ""}
+		}
+	}
+
+	err = db.QueryRow(DB_change(db_set, "select data from other where name = 'user_name_view'")).Scan(&user_name_view)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			user_name_view = ""
+		} else {
+			return []string{"", ""}
+		}
+	}
+
+	if Get_admin_auth(db_set, my_ip) != "" {
+		ip_view = ""
+		user_name_view = ""
+	}
+
+	ip_change := ""
+	if IP_or_user(ip) {
+		if ip_view != "" {
+			hash_ip := Sha224(ip)
+			ip = hash_ip[:10]
+			ip_change = "true"
+		}
+	} else {
+		if user_name_view != "" {
+			var sub_user_name string
+
+			stmt, err := db.Prepare(DB_change(db_set, "select data from user_set where id = ? and name = 'sub_user_name'"))
+			if err != nil {
+				return []string{"", ""}
+			}
+			defer stmt.Close()
+
+			err = stmt.QueryRow(ip).Scan(&sub_user_name)
+			if err != nil {
+				if err == sql.ErrNoRows {
+					sub_user_name = "user"
+				} else {
+					return []string{"", ""}
+				}
+			}
+
+			ip = sub_user_name
+			ip_change = "true"
+		} else {
+			var user_name string
+
+			stmt, err := db.Prepare(DB_change(db_set, "select data from user_set where name = 'user_name' and id = ?"))
+			if err != nil {
+				return []string{"", ""}
+			}
+			defer stmt.Close()
+
+			err = stmt.QueryRow(ip).Scan(&user_name)
+			if err != nil {
+				if err == sql.ErrNoRows {
+					user_name = ip
+				} else {
+					return []string{"", ""}
+				}
+			}
+
+			ip = user_name
+		}
+	}
+
+	return []string{ip, ip_change}
+}
+
+func IP_parser(db_set map[string]string, ip string, my_ip string) string {
+	db := DB_connect(db_set)
+	if db == nil {
+		return ""
+	}
+	defer db.Close()
+
+	ip_pre_data := IP_preprocess(db_set, ip, my_ip)
+	if ip_pre_data[0] == "" {
+		return ""
+	}
+
+	if ip_pre_data[1] != "" {
+		return ip_pre_data[0]
+	} else {
+		raw_ip := ip
+		ip = ip_pre_data[0]
+
+		if !IP_or_user(raw_ip) {
+			var user_name_level string
+			var user_title string
+
+			err := db.QueryRow(DB_change(db_set, "select data from other where name = 'user_name_view'")).Scan(&user_name_level)
+			if err != nil {
+				if err == sql.ErrNoRows {
+					user_name_level = ""
+				} else {
+					return ""
+				}
+			}
+
+			if user_name_level != "" {
+				level_data := Get_level(db_set, raw_ip)
+				ip += "<sup>" + level_data[0] + "</sup>"
+			}
+
+			ip = "<a href=\"/w/" + Url_parser("user:"+raw_ip) + "\">" + ip + "</a>"
+
+			stmt, err := db.Prepare(DB_change(db_set, "select data from user_set where name = 'user_title' and id = ?"))
+			if err != nil {
+				return ""
+			}
+			defer stmt.Close()
+
+			err = stmt.QueryRow(raw_ip).Scan(&user_title)
+			if err != nil {
+				if err == sql.ErrNoRows {
+					user_title = ""
+				} else {
+					return ""
+				}
+			}
+
+			if Get_admin_auth(db_set, ip) != "" {
+				ip = "<b>" + ip + "</b>"
+			}
+
+			ip = user_title + ip
+		}
+
+		ip += " <a href=\"/user/" + Url_parser(raw_ip) + "\">(" + Get_language(db_set, "tool", false) + ")</a>"
+
+		return ip
+	}
+}

+ 47 - 0
route_go/route/tool/language.go

@@ -0,0 +1,47 @@
+package tool
+
+import (
+	"database/sql"
+	"encoding/json"
+	"fmt"
+	"os"
+)
+
+func Get_language(db_set map[string]string, data string, safe bool) string {
+	db := DB_connect(db_set)
+	if db == nil {
+		return ""
+	}
+	defer db.Close()
+
+	var language string
+
+	err := db.QueryRow(DB_change(db_set, "select data from other where name = 'language'")).Scan(&language)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			language = "ko-KR"
+		} else {
+			return ""
+		}
+	}
+
+	file, err := os.Open("./lang/" + language + ".json")
+	if err != nil {
+		fmt.Print(err)
+		return ""
+	}
+	defer file.Close()
+
+	lang_data := map[string]string{}
+
+	decoder := json.NewDecoder(file)
+	if err := decoder.Decode(&lang_data); err != nil {
+		return ""
+	}
+
+	if safe {
+		return lang_data[data]
+	} else {
+		return HTML_escape(lang_data[data])
+	}
+}

+ 25 - 0
route_go/route/tool/some_tool.go

@@ -0,0 +1,25 @@
+package tool
+
+import (
+	"crypto/sha256"
+	"encoding/hex"
+	"html/template"
+	"net/url"
+)
+
+func Sha224(data string) string {
+	hasher := sha256.New224()
+	hasher.Write([]byte(data))
+	hash_byte := hasher.Sum(nil)
+	hash_str := hex.EncodeToString(hash_byte)
+
+	return hash_str
+}
+
+func Url_parser(data string) string {
+	return url.QueryEscape(data)
+}
+
+func HTML_escape(data string) string {
+	return template.HTMLEscapeString(data)
+}

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
     "beta" : {
-        "r_ver" : "v3.5.0-dev10",
+        "r_ver" : "v3.5.0-dev11",
         "c_ver" : "3500374",
         "s_ver" : "3500113"
     }

+ 8 - 1
views/main_css/js/func/func.js

@@ -133,7 +133,14 @@ function opennamu_do_trace_spread() {
 }
 
 function opennamu_do_render(to_obj, name, data, do_type = '') {
-    fetch("/api/render/" + (opennamu_do_url_encode(name)), {
+    let url;
+    if(do_type === '') {
+        url = "/api/render/" + opennamu_do_url_encode(name);
+    } else {
+        url = "/api/render_tool/thread/" + opennamu_do_url_encode(name);
+    }
+
+    fetch(url, {
         method : 'POST',
         headers : { 'Content-Type': 'application/x-www-form-urlencoded' },
         body : new URLSearchParams({

+ 102 - 17
views/main_css/js/route/topic.js

@@ -34,24 +34,109 @@ function opennamu_thread_blind() {
     }
 }
 
-function opennamu_thread_where() {
-    for(let for_a = 0; for_a < document.getElementsByClassName('opennamu_comment_data_main').length; for_a++) {
-        let data = document.getElementsByClassName('opennamu_comment_data_main')[for_a].innerHTML;
-        let id = document.getElementsByClassName('opennamu_comment_data_main')[for_a].id.replace(/^thread_/, '');
-
-        let match = Array.from(data.matchAll(/<a href="#(?:[0-9]+)">#([0-9]+)<\/a>/g)).map(match => match[1]);
-        console.log(data);
-        if(match) {
-            console.log(match);
-            for(let for_b = 0; for_b < match.length; for_b++) {
-                if(document.getElementById('opennamu_topic_req_' + match[for_b])) {
-                    if(document.getElementById('opennamu_topic_req_' + match[for_b]).innerHTML === '') {
-                        document.getElementById('opennamu_topic_req_' + match[for_b]).innerHTML += '<hr>'
-                    }
+function opennamu_get_thread_ui(user_id, date, data, code, color = '', blind = '', add_style = '', topic_num = '') {
+    let color_b, class_b;
+    if(blind == 'O') {
+        color_b = data == '' ? 'opennamu_comment_blind' : 'opennamu_comment_blind_admin';
+        class_b = 'opennamu_comment_blind_js';
+    } else {
+        color_b = 'opennamu_comment_blind_not';
+        class_b = '';
+    }
+
+    let admin_check_box = ''
+    if(topic_num != '') {
+        admin_check_box = '<input type="checkbox" class="opennamu_blind_button" id="opennamu_blind_' + topic_num + '_' + code + '">';
+    }
+        
+    return `
+        <span class="` + class_b + `">
+            <table class="opennamu_comment" style="` + add_style + `">
+                <tr>
+                    <td class="opennamu_comment_color_` + color + `">
+                        ` + admin_check_box + `
+                        <a href="#thread_shortcut" id="` + code + `">#` + code + `</a>
+                        ` + user_id + `
+                        <span style="float: right;">` + date + `</span>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="` + color_b + ` opennamu_comment_data_main" id="thread_` + code + `">
+                        ` + data + `
+                        <div id="opennamu_topic_req_` + code + `"></div>
+                    </td>
+                </tr>
+            </table>
+            <hr class="main_hr">
+        </span>
+    `;
+}
+
+function opennamu_get_thread(topic_num = "", do_type = "") {
+    let url, to_obj, color;    
+    if(do_type === "top") {
+        url = "/api/thread/" + topic_num + "/top";
+        to_obj = 'opennamu_top_thread';
+        color = 'red';
+    } else {
+        url = "/api/thread/" + topic_num;
+        to_obj = 'opennamu_main_thread';
+        color = 'default';
+    }
+
+    fetch(url).then(function(res) {
+        return res.json();
+    }).then(function(data) {
+        fetch("/api/lang/tool").then(function(res) {
+            return res.json();
+        }).then(function(tool_lang) {
+            let end_data = '';
+            let end_render = [];
+
+            data = data["data"];
+            tool_lang = tool_lang["data"];
 
-                    document.getElementById('opennamu_topic_req_' + match[for_b]).innerHTML += '<a href="#' + id + '">#' + id + '</a> ';
+            let first = data[0]["ip"];
+            for(let for_a = 0; for_a < data.length; for_a++) {
+                if(color !== 'red') {
+                    if(data[for_a]["blind"] === '1') {
+                        color = 'blue';
+                    } else if(first === data[for_a]["ip"]) {
+                        color = 'green';
+                    } else {
+                        color = 'default';
+                    }
                 }
+
+                let date = '<a href="/thread/' + topic_num + '/comment/' + data[for_a]["id"] + '/tool">(' + tool_lang + ')</a> ' + data[for_a]["date"];
+
+                end_data += opennamu_get_thread_ui(
+                    data[for_a]["ip_render"], 
+                    date, 
+                    '<div id="opennamu_' + color + '_thread_render_' + data[for_a]["id"] + '"></div>',
+                    data[for_a]["id"],
+                    color,
+                    data[for_a]["blind"],
+                    '',
+                    topic_num
+                )
+
+                end_render.push([
+                    data[for_a]["data"] !== "" ? data[for_a]["data"] : "[br]",
+                    data[for_a]["id"]
+                ]);
             }
-        }
-    }
+
+            document.getElementById(to_obj).innerHTML = end_data;
+
+            for(let for_a = 0; for_a < end_render.length; for_a++) {
+                opennamu_do_render(
+                    'opennamu_' + color + '_thread_render_' + end_render[for_a][1], 
+                    "thread_" + topic_num + "_" + color + "_" + end_render[for_a][1], 
+                    end_render[for_a][0], 
+                    'thread'
+                );
+            }
+        });
+    });
 }