Browse Source

Merge branch 'tmp' into beta

잉여개발기 4 months ago
parent
commit
ae14e8ac0b

+ 55 - 36
app.py

@@ -35,16 +35,23 @@ with get_db_connect(init_mode = True) as conn:
     except:
         setup_tool = 'init'
 
+    old_ver = ""
+
     if setup_tool != 'init':
         ver_set_data = curs.fetchall()
         if ver_set_data:
-            if int(version_list['c_ver']) > int(ver_set_data[0][0]):
+            old_ver = ver_set_data[0][0]
+            if int(version_list['c_ver']) > int(old_ver):
                 setup_tool = 'update'
             else:
                 setup_tool = 'normal'
         else:
             setup_tool = 'init'
 
+    print("Run Mode : " + run_mode)
+    print("Setup Tool : " + setup_tool)
+    print("Old Version : " + old_ver)
+
     if run_mode != 'dev':
         file_name = linux_exe_chmod()
         local_file_path = os.path.join("bin", file_name)
@@ -254,7 +261,7 @@ async def golang_process_check():
                 "ip" : "127.0.0.1"
             }
 
-            response = requests.post('http://localhost:' + server_set["golang_port"] + '/compatible_api/test', data = json_dumps(other_set))
+            response = requests.post('http://127.0.0.1:' + server_set["golang_port"] + '/compatible_api/test', data = json_dumps(other_set))
             if response.status_code == 200:
                 print('Golang turn on')
                 break
@@ -482,7 +489,7 @@ def auto_do_something(data_db_set):
 
 auto_do_something(data_db_set)
 
-print('Now running... http://localhost:' + server_set['port'])
+print('Now running... http://127.0.0.1:' + server_set['port'])
 
 @app.before_request
 def before_request_func():
@@ -646,29 +653,29 @@ app.route('/auth/give/fix/<user_name>', methods = ['POST', 'GET'])(give_user_fix
 app.route('/app_submit', methods = ['POST', 'GET'])(recent_app_submit)
 
 # /auth/history
-app.route('/recent_block')(list_recent_block)
-app.route('/recent_block/all')(list_recent_block)
-app.route('/recent_block/all/<int:num>')(list_recent_block)
-app.route('/recent_block/all/<int:num>/<everything:why>')(list_recent_block)
-app.route('/recent_block/user/<user_name>', defaults = { 'tool' : 'user' })(list_recent_block)
-app.route('/recent_block/user/<user_name>/<int:num>', defaults = { 'tool' : 'user' })(list_recent_block)
-app.route('/recent_block/admin/<user_name>', defaults = { 'tool' : 'admin' })(list_recent_block)
-app.route('/recent_block/admin/<user_name>/<int:num>', defaults = { 'tool' : 'admin' })(list_recent_block)
-app.route('/recent_block/regex', defaults = { 'tool' : 'regex' })(list_recent_block)
-app.route('/recent_block/regex/<int:num>', defaults = { 'tool' : 'regex' })(list_recent_block)
-app.route('/recent_block/cidr', defaults = { 'tool' : 'cidr' })(list_recent_block)
-app.route('/recent_block/cidr/<int:num>', defaults = { 'tool' : 'cidr' })(list_recent_block)
-app.route('/recent_block/private', defaults = { 'tool' : 'private' })(list_recent_block)
-app.route('/recent_block/private/<int:num>', defaults = { 'tool' : 'private' })(list_recent_block)
-app.route('/recent_block/ongoing', defaults = { 'tool' : 'ongoing' })(list_recent_block)
-app.route('/recent_block/ongoing/<int:num>', defaults = { 'tool' : 'ongoing' })(list_recent_block)
+app.route('/recent_block')(golang_view())
+app.route('/recent_block/all')(golang_view())
+app.route('/recent_block/all/<int:num>')(golang_view())
+app.route('/recent_block/all/<int:num>/<everything:why>')(golang_view())
+app.route('/recent_block/user/<user_name>')(golang_view())
+app.route('/recent_block/user/<user_name>/<int:num>')(golang_view())
+app.route('/recent_block/admin/<user_name>')(golang_view())
+app.route('/recent_block/admin/<user_name>/<int:num>')(golang_view())
+app.route('/recent_block/regex')(golang_view())
+app.route('/recent_block/regex/<int:num>')(golang_view())
+app.route('/recent_block/cidr')(golang_view())
+app.route('/recent_block/cidr/<int:num>')(golang_view())
+app.route('/recent_block/private')(golang_view())
+app.route('/recent_block/private/<int:num>')(golang_view())
+app.route('/recent_block/ongoing')(golang_view())
+app.route('/recent_block/ongoing/<int:num>')(golang_view())
 
 app.route('/recent_change')(golang_view())
 app.route('/recent_changes')(golang_view())
 app.route('/recent_change/<int:num>/<set_type>')(golang_view())
 
-app.route('/recent_discuss', defaults = { 'tool' : 'normal' })(list_recent_discuss)
-app.route('/recent_discuss/<int:num>/<tool>')(list_recent_discuss)
+app.route('/recent_discuss')(golang_view())
+app.route('/recent_discuss/<int:num>/<tool>')(golang_view())
 
 # Func-history
 app.route('/recent_edit_request')(recent_edit_request)
@@ -701,13 +708,13 @@ app.route('/xref_this_page/<int:num>/<everything:name>', defaults = { 'xref_type
 app.route('/doc_watch_list/<int:num>/<everything:name>')(golang_view())
 app.route('/doc_star_doc/<int:num>/<everything:name>')(golang_view())
 
-app.route('/raw/<everything:name>')(view_w_raw)
-app.route('/raw_acl/<everything:name>', defaults = { 'doc_acl' : 'on' })(view_w_raw)
-app.route('/raw_rev/<int(signed = True):rev>/<everything:name>')(view_w_raw)
+app.route('/raw/<everything:name>')(golang_view())
+app.route('/raw_acl/<everything:name>')(golang_view())
+app.route('/raw_rev/<int(signed = True):rev>/<everything:name>')(golang_view())
 
 app.route('/diff/<int(signed = True):num_a>/<int(signed = True):num_b>/<everything:name>')(view_diff)
 
-app.route('/down/<everything:name>')(view_down)
+app.route('/down/<everything:name>')(golang_view())
 
 app.route('/acl_multiple', defaults = { 'multiple' : True }, methods = ['POST', 'GET'])(view_set)
 app.route('/acl/<everything:name>', methods = ['POST', 'GET'])(view_set)
@@ -842,13 +849,14 @@ app.route('/vote/add', methods = ['POST', 'GET'])(vote_add)
 # Func-bbs
 app.route('/bbs/main')(golang_view())
 app.route('/bbs/make', methods = ['POST', 'GET'])(bbs_make)
-app.route('/bbs/in/<int:bbs_num>')(bbs_in)
-app.route('/bbs/in/<int:bbs_num>/<int:page>')(bbs_in)
+app.route('/bbs/in/<int:bbs_num>')(golang_view())
+app.route('/bbs/in/<int:bbs_num>/<int:page>')(golang_view())
 # app.route('/bbs/blind/<int:bbs_num>', methods = ['POST', 'GET'])(bbs_hide)
 app.route('/bbs/delete/<int:bbs_num>', methods = ['POST', 'GET'])(bbs_delete)
 app.route('/bbs/set/<int:bbs_num>', methods = ['POST', 'GET'])(bbs_w_set)
 app.route('/bbs/edit/<int:bbs_num>', methods = ['POST', 'GET'])(bbs_w_edit)
-app.route('/bbs/w/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_post)
+app.route('/bbs/w/<int:bbs_num>/<int:post_num>', methods = ['POST'])(bbs_w_post)
+app.route('/bbs/w/<int:bbs_num>/<int:post_num>', methods = ['GET'])(golang_view())
 # app.route('/bbs/blind/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_hide)
 app.route('/bbs/pinned/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_pinned)
 app.route('/bbs/delete/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_delete)
@@ -933,15 +941,21 @@ app.route('/api/v2/bbs')(api_bbs_list)
 app.route('/api/v2/bbs/main')(api_bbs_exter)
 app.route('/api/v2/bbs/set/<int:bbs_num>/<name>', methods = ['GET', 'PUT'])(api_bbs_w_set)
 app.route('/api/v2/bbs/in/<int:bbs_num>/<int:page>')(api_bbs_exter)
+
 app.route('/api/v2/bbs/w/<sub_code>', defaults = { 'legacy' : '' })(api_bbs_w)
 app.route('/api/v2/bbs/w/tabom/<sub_code>', methods = ['GET', 'POST'])(api_bbs_w_tabom)
 app.route('/api/v2/bbs/w/comment/<sub_code>/<tool>', defaults = { 'legacy' : '' })(api_bbs_w_comment_exter)
 app.route('/api/v2/bbs/w/comment_one/<sub_code>/<tool>', defaults = { 'legacy' : '' })(api_bbs_w_comment_one_exter)
 
+app.route('/api/v2/bbs/w/page_view/<set_id>/<set_code>')(golang_view())
+app.route('/api/v2/bbs/w/page_view_post/<set_id>/<set_code>')(golang_view())
+
 app.route('/api/v2/doc_star_doc/<int:num>/<everything:name>', defaults = { 'do_type' : 'star_doc' })(api_w_watch_list)
 app.route('/api/v2/doc_watch_list/<int:num>/<everything:name>')(api_w_watch_list)
 app.route('/api/v2/set_reset/<everything:name>')(api_w_set_reset)
-app.route('/api/v2/page_view/<everything:name>')(api_w_page_view)
+
+app.route('/api/v2/page_view/<everything:name>')(golang_view())
+app.route('/api/v2/page_view_post/<everything:name>')(golang_view())
 
 app.route('/api/v2/setting/<name>', methods = ['GET', 'PUT'])(api_setting_exter)
 
@@ -964,13 +978,18 @@ app.route('/manager', methods = ['POST', 'GET'])(main_tool_admin)
 app.route('/manager/<int:num>', methods = ['POST', 'GET'])(main_tool_redirect)
 app.route('/manager/<int:num>/<everything:add_2>', methods = ['POST', 'GET'])(main_tool_redirect)
 
-app.route('/search', methods=['POST'])(main_search)
-app.route('/search/<everything:name>', methods = ['POST', 'GET'])(main_search_deep)
-app.route('/search_page/<int:num>/<everything:name>', methods = ['POST', 'GET'])(main_search_deep)
-app.route('/search_data/<everything:name>', defaults = { 'search_type' : 'data' }, methods = ['POST', 'GET'])(main_search_deep)
-app.route('/search_data_page/<int:num>/<everything:name>', defaults = { 'search_type' : 'data' }, methods = ['POST', 'GET'])(main_search_deep)
-app.route('/goto', methods=['POST'])(main_search_goto)
-app.route('/goto/<everything:name>', methods=['GET', 'POST'])(main_search_goto)
+app.route('/goto', methods = ['POST'])(golang_view())
+app.route('/goto/<everything:name>', methods = ['GET', 'POST'])(golang_view())
+app.route('/search', methods = ['POST'])(golang_view())
+app.route('/search/<everything:name>', methods = ['POST'])(golang_view())
+app.route('/search_page/<int:num>/<everything:name>', methods = ['POST'])(golang_view())
+app.route('/search_data/<everything:name>', methods = ['POST'])(golang_view())
+app.route('/search_data_page/<int:num>/<everything:name>', methods = ['POST'])(golang_view())
+
+app.route('/search/<everything:name>', methods = ['GET'])(golang_view())
+app.route('/search_page/<int:num>/<everything:name>', methods = ['GET'])(golang_view())
+app.route('/search_data/<everything:name>', methods = ['GET'])(golang_view())
+app.route('/search_data_page/<int:num>/<everything:name>', methods = ['GET'])(golang_view())
 
 app.route('/setting')(main_setting)
 app.route('/setting/main', methods = ['POST', 'GET'])(main_setting_main)

+ 1 - 8
route/__init__.py

@@ -143,12 +143,9 @@ from route.user_watch_list_name import user_watch_list_name
 
 from route.view_set import view_set
 from route.view_diff import view_diff
-from route.view_down import view_down
-from route.view_raw import view_raw
-from route.view_w_raw import view_w_raw
 from route.view_w import view_w
+from route.view_raw import view_raw
 from route.view_xref import view_xref
-from route.view_random import view_random
 
 from route.vote_add import vote_add
 from route.vote_close import vote_close
@@ -156,15 +153,12 @@ from route.vote_end import vote_end
 from route.vote_list import vote_list
 from route.vote_select import vote_select
 
-from route.n_list_recent_discuss import list_recent_discuss
-from route.n_list_recent_block import list_recent_block
 from route.n_list_user_check_submit import list_user_check_submit
 
 from route.n_topic_list import topic_list
 
 from route.n_give_auth import give_auth
 
-from route.n_bbs_in import bbs_in
 from route.n_bbs_w_set import bbs_w_set
 
 from route.n_edit_move_all import edit_move_all
@@ -213,6 +207,5 @@ from route.go_api_w_xref import api_w_xref
 from route.go_api_w_watch_list import api_w_watch_list
 from route.go_api_w_render import api_w_render, api_w_render_exter
 from route.go_api_w_set_reset import api_w_set_reset
-from route.go_api_w_page_view import api_w_page_view
 
 from route.go_main_func_easter_egg import main_func_easter_egg

+ 19 - 57
route/bbs_w_post.py

@@ -7,52 +7,6 @@ from .go_api_topic import api_topic_thread_make, api_topic_thread_pre_render
 
 from .edit import edit_editor
 
-async def bbs_w_post_comment(conn, user_id, sub_code, comment_num, bbs_num_str, post_num_str):
-    comment_data = ''
-    comment_select = ''
-
-    comment_count = 0
-    comment_add_count = 0
-
-    thread_data = await api_bbs_w_comment(sub_code)
-
-    for temp_dict in thread_data:
-        if temp_dict['comment_user_id'] != '':
-            color = 'default'
-            if user_id == temp_dict['comment_user_id']:
-                color = 'green'
-
-            sub_code_check = re.sub(r'^[0-9]+-[0-9]+-', '', temp_dict['id'] + '-' + temp_dict['code'])
-            margin_count = sub_code_check.count('-')
-
-            if margin_count == 0:
-                comment_count += 1
-            else:
-                comment_add_count += 1
-
-            date = ''
-            date += '<a href="javascript:opennamu_change_comment(\'' + sub_code_check + '\');">(' + await get_lang('comment') + ')</a> '
-            date += '<a href="/bbs/tool/' + bbs_num_str + '/' + post_num_str + '/' + sub_code_check + '">(' + await get_lang('tool') + ')</a> '
-            date += temp_dict['comment_date']
-
-            comment_data += '<span style="padding-left: 20px;"></span>' * margin_count
-            comment_data += api_topic_thread_make(
-                await ip_pas(temp_dict['comment_user_id']),
-                date,
-                await render_set(conn, doc_data = temp_dict['comment']),
-                sub_code_check,
-                color = color,
-                add_style = 'width: calc(100% - ' + str(margin_count * 20) + 'px);'
-            )
-
-            comment_default = ''
-            if comment_num == sub_code_check:
-                comment_default = 'selected'
-
-            comment_select += '<option value="' + sub_code_check + '" ' + comment_default + '>' + sub_code_check + '</option>'
-
-    return (comment_data, comment_select, comment_count, comment_add_count)
-
 async def bbs_w_post(bbs_num = '', post_num = ''):
     with get_db_connect() as conn:
         curs = conn.cursor()
@@ -178,17 +132,20 @@ async def bbs_w_post(bbs_num = '', post_num = ''):
                 date += '<a href="javascript:opennamu_change_comment(\'0\');">(' + await get_lang('comment') + ')</a> '
                 date += temp_dict['date']
 
-                data = ''
-                data += '<h2>' + html.escape(temp_dict['title']) + '</h2>'
-                data += api_topic_thread_make(
-                    await ip_pas(temp_dict['user_id']),
-                    date,
-                    await render_set(conn, doc_data = temp_dict['data']),
-                    '0',
-                    color = 'red'
-                )
+                data = '<div class="opennamu_bbs_w_post_tab">'
+                data += '<big><big><big>' + html.escape(temp_dict['title']) + '</big></big></big>'
+                data += '<hr class="main_hr">'
+                data += await ip_pas(temp_dict['user_id']) + '<span style="float: right;">' + date + '</span>'
+                data += '<hr>'
+                data += '<div class="opennamu_bbs_w_post_tab_content">' + await render_set(conn, doc_data = temp_dict['data']) + '</div>'
+                data += '</div>'
+
+                if bbs_comment_acl == 0:
+                    data += '<hr class="main_hr">'
+                    data += '<div id="opennamu_bbs_w_post_tabom"></div>'
 
                 data += '' + \
+                    '<hr>' + \
                     '<div id="opennamu_bbs_w_post"></div>' + \
                     '<script defer src="/views/main_css/js/route/topic.js' + cache_v() + '"></script>' + \
                     '<script defer src="/views/main_css/js/route/bbs_w_post.js' + cache_v() + '"></script>' + \
@@ -198,7 +155,6 @@ async def bbs_w_post(bbs_num = '', post_num = ''):
                 bbs_comment_form = ''
                 if bbs_comment_acl == 0:
                     bbs_comment_form += '''
-                        <div id="opennamu_bbs_w_post_tabom"></div>
                         <div id="opennamu_bbs_w_post_select"></div>
                         ''' + await edit_editor(conn, ip, '', 'bbs_comment') + '''
                     '''
@@ -208,10 +164,16 @@ async def bbs_w_post(bbs_num = '', post_num = ''):
                         ''' + bbs_comment_form + '''
                     </form>
                 '''
+                
+                await python_to_golang("get_json", path = "v2/bbs/w/page_view_post/" + url_pas(bbs_num_str) + "/" + url_pas(post_num_str))
+
+                view_count_data = await python_to_golang("get_json", path = "v2/bbs/w/page_view/" + url_pas(bbs_num_str) + "/" + url_pas(post_num_str))
+                view_count = view_count_data['data']
 
                 return await render_template(
                     bbs_name,
                     data,
                     '(' + await get_lang('bbs') + ')',
-                    [['bbs/in/' + bbs_num_str, await get_lang('return')], ['bbs/edit/' + bbs_num_str + '/' + post_num_str, await get_lang('edit')], ['bbs/tool/' + bbs_num_str + '/' + post_num_str, await get_lang('tool')]]
+                    [['bbs/in/' + bbs_num_str, await get_lang('return')], ['bbs/edit/' + bbs_num_str + '/' + post_num_str, await get_lang('edit')], ['bbs/tool/' + bbs_num_str + '/' + post_num_str, await get_lang('tool')]],
+                    [temp_dict['date'], 0, 0, view_count],
                 )

+ 6 - 2
route/go_api_bbs_w.py

@@ -2,10 +2,14 @@ from .tool.func import *
 
 async def api_bbs_w(sub_code = '', legacy = 'on'):
     other_set = {}
-    other_set["legacy"] = legacy
     other_set['sub_code'] = sub_code
 
-    return await python_to_golang(sys._getframe().f_code.co_name, other_set)
+    data = await python_to_golang(sys._getframe().f_code.co_name, other_set)
+
+    if legacy == "on":
+        return data["data"]
+    else:
+        return data
 
 async def api_bbs_w_exter(sub_code = '', legacy = 'on'):
     return flask.jsonify(await api_bbs_w(sub_code, legacy))

+ 5 - 2
route/go_api_bbs_w_comment.py

@@ -4,9 +4,12 @@ async def api_bbs_w_comment(sub_code = '', tool = "", legacy = 'on'):
     other_set = {}
     other_set["sub_code"] = sub_code
     other_set["tool"] = tool
-    other_set["legacy"] = legacy
 
-    return await python_to_golang(sys._getframe().f_code.co_name, other_set)
+    data = await python_to_golang(sys._getframe().f_code.co_name, other_set)
+    if legacy == "on":
+        return data["data"]
+    else:
+        return data
 
 async def api_bbs_w_comment_exter(sub_code = '', tool = "", legacy = 'on'):
     return flask.jsonify(await api_bbs_w_comment(sub_code, tool, legacy))

+ 2 - 1
route/go_api_func_language.py

@@ -1,6 +1,6 @@
 from .tool.func import *
 
-async def api_func_language(legacy = 'on', data = 'Test'):
+async def api_func_language(legacy = 'on', data = 'Test', safe = ''):
     other_set = {}
     if flask.request.method == 'POST':
         other_set["data"] = flask.request.form.get('data', '')
@@ -8,6 +8,7 @@ async def api_func_language(legacy = 'on', data = 'Test'):
         other_set["data"] = data
 
     other_set["legacy"] = legacy
+    other_set["safe"] = safe
 
     return await python_to_golang(sys._getframe().f_code.co_name, other_set)
 

+ 0 - 7
route/go_api_w_page_view.py

@@ -1,7 +0,0 @@
-from .tool.func import *
-
-async def api_w_page_view(name = 'Test'):
-    other_set = {}
-    other_set["doc_name"] = name
-
-    return flask.jsonify(await python_to_golang(sys._getframe().f_code.co_name, other_set))

+ 0 - 5
route/main_search.py

@@ -1,5 +0,0 @@
-from .tool.func import *
-
-async def main_search():
-    with get_db_connect() as conn:
-        return redirect(conn, '/search/' + url_pas(flask.request.form.get('search', 'test')))

+ 0 - 65
route/n_bbs_in.py

@@ -1,65 +0,0 @@
-from .tool.func import *
-
-from .go_api_bbs import api_bbs
-
-async def bbs_in(bbs_num = 1, page = 1):
-    with get_db_connect() as conn:
-        curs = conn.cursor()
-
-        bbs_num_str = str(bbs_num)
-
-        curs.execute(db_change('select set_data from bbs_set where set_id = ? and set_name = "bbs_name"'), [bbs_num])
-        db_data = curs.fetchall()
-        if not db_data:
-            return redirect(conn, '/bbs/main')
-    
-        bbs_name = db_data[0][0]
-
-    return await render_template(
-        bbs_name,
-        '' + \
-            '<div id="opennamu_bbs_in"></div>' + \
-            '<script defer src="/views/main_css/js/route/bbs_in.js' + cache_v() + '"></script>' + \
-            '<script>window.addEventListener("DOMContentLoaded", function() { opennamu_bbs_in(); });</script>' + \
-        '',
-        '(' + await get_lang('bbs') + ') (' + str(page) + ')',
-        [['bbs/main', await get_lang('return')], ['bbs/edit/' + bbs_num_str, await get_lang('add')], ['bbs/set/' + bbs_num_str, await get_lang('bbs_set')]]
-    )
-
-'''
-async def bbs_in(bbs_num = 1, page = 1):
-    with get_db_connect() as conn:
-        curs = conn.cursor()
-
-        bbs_num_str = str(bbs_num)
-
-        curs.execute(db_change('select set_data from bbs_set where set_id = ? and set_name = "bbs_name"'), [bbs_num])
-        db_data = curs.fetchall()
-        if not db_data:
-            return redirect(conn, '/bbs/main')
-    
-        bbs_name = db_data[0][0]
-
-    data = await api_bbs(bbs_num, page)
-
-    data_html = ''
-    for for_a in range(len(data)):
-        data_html += '<div class="opennamu_recent_change">'
-        data_html += '<a href="/bbs/w/' + data[for_a]['set_id'] + '/' + data[for_a]['set_code'] + '">' + html.escape(data[for_a]['title']) + '</a>'
-        data_html += '<div style="float: right;">'
-        data_html += '<span id="opennamu_bbs_comment_' + str(for_a) + '"></span>'
-        data_html += data[for_a]['user_id_render'] + ' | '
-
-        if data[for_a]['pinned'] == '1':
-            data_html += '<span style="color: red;">' + data[for_a]['date'] + '</span>'
-        else:
-            data_html += data[for_a]['date']
-
-            data_html += '</div>'
-            data_html += '<div style="clear: both;"></div>'
-
-            data_html += '</div>'
-            data_html += '<hr class="main_hr">'
-
-        get_next_page_bottom()
-'''

+ 0 - 27
route/n_list_recent_block.py

@@ -1,27 +0,0 @@
-from .tool.func import *
-
-async def list_recent_block(user_name = 'Test', tool = 'all', num = 1, why = ''):
-    sub = 0
-    if tool == 'ongoing':
-        sub = '(' + await get_lang('in_progress') + ')'
-    elif tool == 'regex':
-        sub = '(' + await get_lang('regex') + ')'
-    elif tool == 'user':
-        sub = '(' + await get_lang('blocked') + ')'
-    elif tool == 'cidr':
-        sub = '(' + await get_lang('cidr') + ')'
-    elif tool == 'private':
-        sub = '(' + await get_lang('private') + ')'
-    elif tool == 'admin':
-        sub = '(' + await get_lang('admin') + ')'
-
-    return await render_template(
-        await get_lang('recent_ban'),
-        '' + \
-            '<div id="opennamu_list_recent_block"></div>' + \
-            '<script defer src="/views/main_css/js/route/list_recent_block.js' + cache_v() + '"></script>' + \
-            '<script>window.addEventListener("DOMContentLoaded", function() { opennamu_list_recent_block(); });</script>' + \
-        '',
-        sub,
-        [['other', await get_lang('return')]]
-    )

+ 0 - 19
route/n_list_recent_discuss.py

@@ -1,19 +0,0 @@
-from .tool.func import *
-
-async def list_recent_discuss(num = 1, tool = 'normal'):
-    m_sub = 0
-    if tool == 'close':
-        m_sub = '(' + await get_lang('close_discussion') + ')'
-    elif tool == 'open':
-        m_sub = '(' + await get_lang('open_discussion') + ')'
-
-    return await render_template(
-        await get_lang('recent_discussion'),
-        '' + \
-            '<div id="opennamu_list_recent_discuss"></div>' + \
-            '<script defer src="/views/main_css/js/route/list_recent_discuss.js' + cache_v() + '"></script>' + \
-            '<script>window.addEventListener("DOMContentLoaded", function() { opennamu_list_recent_discuss(); });</script>' + \
-        '',
-        m_sub,
-        [['other', await get_lang('return')]]
-    )

+ 66 - 26
route/tool/func.py

@@ -108,7 +108,7 @@ async def render_template(name, data, sub, menu, other = []):
     other_set["sub"] = [sub] + other
     other_set["menu"] = menu
 
-    return await python_to_golang("template", other_set)
+    return await python_to_golang("post", other_set = other_set, path = "template")
 
 global_lang_data = {}
 global_some_set = {}
@@ -147,7 +147,7 @@ def global_some_set_do(set_name, data = None):
     else:
         return None
 
-async def python_to_golang(func_name, other_set = {}):    
+async def python_to_golang(func_name, other_set = {}, path = ''):    
     headers = {}
     if flask.has_request_context():
         if "Cookie" in flask.request.headers:
@@ -162,24 +162,45 @@ async def python_to_golang(func_name, other_set = {}):
     if func_name == "same":
         async with aiohttp.ClientSession() as session:
             if flask.request.method == 'POST':
-                async with session.post('http://localhost:' + port_data + flask.request.path, data = json_dumps(other_set), headers = headers) as res:
+                form_data = flask.request.form.to_dict(flat = False)
+
+                async with session.post('http://127.0.0.1:' + port_data + flask.request.path, data = form_data, headers = headers) as res:
                     data = await res.text()
 
                     return data
             else:
-                async with session.get('http://localhost:' + port_data + flask.request.path, headers = headers) as res:
+                async with session.get('http://127.0.0.1:' + port_data + flask.request.path, headers = headers) as res:
                     data = await res.text()
 
                     return data
-    elif func_name == "template":
-        async with aiohttp.ClientSession() as session:
-            async with session.post('http://localhost:' + port_data + "/api/template", data = json_dumps(other_set), headers = headers) as res:
-                data = await res.text()
+    elif path != "":
+        if func_name == "get":
+            async with aiohttp.ClientSession() as session:
+                async with session.get('http://127.0.0.1:' + port_data + "/api/" + path, headers = headers) as res:
+                    data = await res.text()
+
+                    return data
+        elif func_name == "post":
+            async with aiohttp.ClientSession() as session:
+                async with session.post('http://127.0.0.1:' + port_data + "/api/" + path, data = json_dumps(other_set), headers = headers) as res:
+                    data = await res.text()
+
+                    return data
+        elif func_name == "get_json":
+            async with aiohttp.ClientSession() as session:
+                async with session.get('http://127.0.0.1:' + port_data + "/api/" + path, headers = headers) as res:
+                    data = await res.json()
+
+                    return data
+        else:
+            async with aiohttp.ClientSession() as session:
+                async with session.post('http://127.0.0.1:' + port_data + "/api/" + path, data = json_dumps(other_set), headers = headers) as res:
+                    data = await res.json()
 
-                return data
+                    return data
     else:
         async with aiohttp.ClientSession() as session:
-            async with session.post('http://localhost:' + port_data + '/compatible_api/' + func_name, data = json_dumps(other_set), headers = headers) as res:
+            async with session.post('http://127.0.0.1:' + port_data + '/compatible_api/' + func_name, data = json_dumps(other_set), headers = headers) as res:
                 data = await res.json()
 
                 if "response" in data and data["response"] == "error":
@@ -278,14 +299,25 @@ class get_db_connect:
             while self.conn == None and try_cnt <= max_try:
                 try:
                     if self.init_mode:
-                        self.conn = pymysql.connect(
-                            host = self.db_set['db_mysql_host'],
-                            user = self.db_set['db_mysql_user'],
-                            password = self.db_set['db_mysql_pw'],
-                            charset = 'utf8mb4',
-                            port = int(self.db_set['db_mysql_port']),
-                            autocommit = True
-                        )
+                        try:
+                            self.conn = pymysql.connect(
+                                host = self.db_set['db_mysql_host'],
+                                user = self.db_set['db_mysql_user'],
+                                password = self.db_set['db_mysql_pw'],
+                                charset = 'utf8mb4',
+                                port = int(self.db_set['db_mysql_port']),
+                                autocommit = True,
+                                db = self.db_set['db_name']
+                            )
+                        except pymysql.err.OperationalError:
+                            self.conn = pymysql.connect(
+                                host = self.db_set['db_mysql_host'],
+                                user = self.db_set['db_mysql_user'],
+                                password = self.db_set['db_mysql_pw'],
+                                charset = 'utf8mb4',
+                                port = int(self.db_set['db_mysql_port']),
+                                autocommit = True
+                            )
                     else:
                         self.conn = pymysql.connect(
                             host = self.db_set['db_mysql_host'],
@@ -302,6 +334,7 @@ class get_db_connect:
                 finally:
                     if self.conn == None:
                         try_cnt += 1
+                        
                         time.sleep(1)
 
             if self.conn == None:
@@ -392,7 +425,7 @@ class class_check_json:
         if do_check_mysql_env():
             # ['user', 'password', 'host', 'port']
             set_data_mysql = {}
-            set_data_mysql['host'] = os.getenv('NAMU_DB_HOST') if os.getenv('NAMU_DB_HOST') else 'localhost'
+            set_data_mysql['host'] = os.getenv('NAMU_DB_HOST') if os.getenv('NAMU_DB_HOST') else '127.0.0.1'
             set_data_mysql['port'] = os.getenv('NAMU_DB_PORT') if os.getenv('NAMU_DB_PORT') else 3306
 
             if not os.getenv('NAMU_DB_USER'):
@@ -424,10 +457,10 @@ class class_check_json:
             print('DB password : ', end = '')
             set_data_mysql['password'] = str(input())
 
-            print('DB host (localhost) : ', end = '')
+            print('DB host (127.0.0.1) : ', end = '')
             set_data_mysql['host'] = str(input())
             if set_data_mysql['host'] == '':
-                set_data_mysql['host'] = 'localhost'
+                set_data_mysql['host'] = '127.0.0.1'
 
             print('DB port (3306) : ', end = '')
             set_data_mysql['port'] = str(input())
@@ -442,7 +475,7 @@ class class_check_json:
         if 'host' in set_data_mysql:
             data_db_set['mysql_host'] = set_data_mysql['host']
         else:
-            data_db_set['mysql_host'] = 'localhost'
+            data_db_set['mysql_host'] = '127.0.0.1'
 
         if 'port' in set_data_mysql:
             data_db_set['mysql_port'] = set_data_mysql['port']
@@ -553,7 +586,7 @@ async def update(conn, ver_num, set_data):
         get_data_mysql = json_loads(open('data/mysql.json', encoding = 'utf8').read())
         
         with open('data/mysql.json', 'w') as f:
-            f.write('{ "user" : "' + get_data_mysql['user'] + '", "password" : "' + get_data_mysql['password'] + '", "host" : "localhost" }')
+            f.write('{ "user" : "' + get_data_mysql['user'] + '", "password" : "' + get_data_mysql['password'] + '", "host" : "127.0.0.1" }')
 
         ver_num = 3172800
 
@@ -1261,21 +1294,28 @@ def pw_check(conn, data, data2, type_d = 'no', id_d = ''):
 # Func-skin
 async def get_lang(data, safe = 0):
     if data in global_lang_data:
-        return global_lang_data[data]
+        if safe == 1:
+            return html.unescape(global_lang_data[data])
+        else:
+            return global_lang_data[data]
     else:
         lang = json_loads(open(os.path.join('lang', 'en-US.json'), encoding = 'utf-8').read())
 
         other_set = {}
         other_set["data"] = ' '.join([title for title in lang if title[0] != '_'])
         other_set["legacy"] = ""
+        other_set["safe"] = ""
 
         res = await python_to_golang('api_func_language', other_set)
         if res['response'] == 'ok':
             for load_data in res['data']:
                 global_lang_data[load_data] = res['data'][load_data]
-        
+
         if data in global_lang_data:
-            return global_lang_data[data]
+            if safe == 1:
+                return html.unescape(global_lang_data[data])
+            else:
+                return global_lang_data[data]
         else:
             return data + ' (M)'
 

+ 0 - 20
route/view_down.py

@@ -1,20 +0,0 @@
-from .tool.func import *
-
-async def view_down(name = 'Test'):
-    with get_db_connect() as conn:
-        curs = conn.cursor()
-
-        div = '<ul>'
-
-        curs.execute(db_change("select title from data where title like ?"), [name + '/%'])
-        for data in curs.fetchall():
-            div += '<li><a href="/w/' + url_pas(data[0]) + '">' + html.escape(data[0]) + '</a></li>'
-
-        div += '</ul>'
-
-        return await render_template(
-            name,
-            div,
-            '(' + await get_lang('sub') + ')',
-            [['w/' + url_pas(name), await get_lang('return')]]
-        )

+ 0 - 9
route/view_random.py

@@ -1,9 +0,0 @@
-from .tool.func import *
-
-from .go_api_w_random import api_w_random
-
-async def view_random():
-    with get_db_connect() as conn:
-        data = (await api_w_random())["data"]
-        
-        return redirect(conn, '/w/' + url_pas(data))

+ 12 - 11
route/view_w.py

@@ -2,7 +2,6 @@ from .tool.func import *
 
 from .go_api_w_raw import api_w_raw
 from .go_api_w_render import api_w_render
-from .go_api_w_page_view import api_w_page_view
 
 async def view_w(name = 'Test', do_type = '', doc_rev = ''):
     with get_db_connect() as conn:
@@ -197,7 +196,7 @@ async def view_w(name = 'Test', do_type = '', doc_rev = ''):
             end_data = ''
 
         if doc_rev == '':
-            await api_w_page_view(name)
+            await python_to_golang("get_json", path = "v2/page_view_post/" + url_pas(name))
             curs.execute(db_change("select data from data where title = ?"), [name])
         else:
             curs.execute(db_change("select data from history where title = ? and id = ?"), [name, doc_rev])
@@ -320,15 +319,6 @@ async def view_w(name = 'Test', do_type = '', doc_rev = ''):
         r_date = curs.fetchall()
         r_date = r_date[0][0] if r_date else 0
 
-        curs.execute(db_change("select data from other where name = 'not_use_view_count'"))
-        view_count_set = curs.fetchall()
-        if view_count_set and view_count_set[0][0] != "":
-            view_count = 0
-        else:
-            curs.execute(db_change("select set_data from data_set where doc_name = ? and set_name = 'view_count' and doc_rev = ''"), [name])
-            view_count = curs.fetchall()
-            view_count = view_count[0][0] if view_count else 0
-
         div = file_data + user_doc + end_data + category_total
         
         if doc_type == '':
@@ -366,6 +356,17 @@ async def view_w(name = 'Test', do_type = '', doc_rev = ''):
         if doc_rev != '':
             sub = '(' + str(doc_rev) + ')'
 
+        view_count_data = await python_to_golang("get_json", path = "v2/page_view/" + url_pas(name))
+        view_count = view_count_data['data']
+
+        other_set = {}
+        other_set['doc_name'] = name
+
+        comment_api = await python_to_golang("api_w_comment", other_set = other_set)
+        comment = comment_api['data']
+
+        div += comment
+
         return await render_template(
             name_view,
             div,

+ 0 - 44
route/view_w_raw.py

@@ -1,44 +0,0 @@
-from .tool.func import *
-
-from .go_api_w_raw import api_w_raw
-
-async def view_w_raw(name = '', rev = '', doc_acl = ''):
-    with get_db_connect() as conn:
-        rev_str = str(rev)
-
-        sub = '(' + await get_lang('raw') + ')'
-        sub += ' (' + rev_str + ')' if rev != '' else ''
-
-        if rev != '':
-            menu = [['history_tool/' + rev_str + '/' + url_pas(name), await get_lang('return')]]
-        else:
-            menu = [['w/' + url_pas(name), await get_lang('return')]]
-
-        data = await api_w_raw(name, rev)
-        if data["response"] == "ok":
-            data_in = data["data"]
-        else:
-            data_in = ''
-
-        p_data = ''
-        p_data += '''
-            <div id="opennamu_preview_area">
-                <textarea readonly id="opennamu_edit_textarea" class="opennamu_textarea_500 __ON_TEXTAREA__">''' + html.escape(data_in) + '''</textarea>
-            </div>
-        '''
-        
-        if doc_acl == 'on':
-            p_data = '' + \
-                await get_lang('authority_error') + \
-                '<hr class="main_hr">' + \
-                p_data
-            ''
-            
-            sub = ' (' + await get_lang('edit') + ')'
-
-        return await render_template(
-            name,
-            p_data,
-            sub,
-            menu
-        )

+ 3 - 3
version.json

@@ -1,6 +1,6 @@
 {
-    "r_ver" : "v3.6.0-Beta-v46",
-    "c_ver" : "20250519",
+    "r_ver" : "v3.6.0-Beta-v49",
+    "c_ver" : "20250523",
     "s_ver" : "20240426",
-    "bin_link" : "https://github.com/openNAMU/GopenNAMU/releases/download/v2025-12-07-Beta-v8/"
+    "bin_link" : "https://github.com/openNAMU/GopenNAMU/releases/download/v2025-12-07-Beta-v9/"
 }

+ 16 - 6
views/main_css/css/main.css

@@ -491,21 +491,31 @@
 }
 
 .opennamu_main .opennamu_svg_tabom {
+    width: 50px;
+    height: 50px;
+
     background-image: url(/views/main_css/file/icon/thumbs-up.svg);
 }
 
-#opennamu_bbs_w_post_tabom {
+.opennamu_main #opennamu_bbs_w_post_tabom {
     text-align: center;
-}
 
-.opennamu_main .opennamu_bbs_w_post_tabom {
-    width: 75px;
-    height: 75px;
+    margin: auto;
+
+    width: 50px;
 
     padding: 15px;
     
-    border: 2px solid gray;
+    border: 4px solid gray;
 
     background-size: 100% 100%;
     background-origin: content-box;
+    
+    box-sizing: content-box;
 }
+
+.opennamu_main .opennamu_bbs_w_post_tab {
+    padding: 20px;
+
+    border: 1px solid gainsboro;
+}

BIN
views/main_css/file/l_logo.webp


BIN
views/main_css/file/s_logo.webp


+ 0 - 46
views/main_css/js/func/func.js

@@ -240,52 +240,6 @@ function opennamu_do_trace_spread() {
     }
 }
 
-function opennamu_do_render(to_obj, data, name = '', do_type = '', option = '', callback = undefined) {
-    let url;
-    if (do_type === '') {
-        url = "/api/render";
-    } else {
-        url = "/api/render/" + do_type;
-    }
-
-    fetch(url, {
-        method: 'POST',
-        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
-        body: new URLSearchParams({
-            'name': name,
-            'data': data,
-            'option': option
-        })
-    })
-        .then(response => {
-            if (!response.ok) {
-                throw new Error(`API 호출 실패: ${response.status}`);
-            }
-            return response.json();
-        })
-        .then(text => {
-            if (document.getElementById(to_obj)) {
-                if (text["data"]) {
-                    document.getElementById(to_obj).innerHTML = text["data"];
-                    eval(text["js_data"]);
-                } else {
-                    document.getElementById(to_obj).innerHTML = '';
-                }
-
-                if (callback) {
-                    callback();
-                }
-            }
-        })
-        .catch(err => {
-            console.error('렌더링 호출 중 오류 발생:', err);
-            if (document.getElementById(to_obj)) {
-                document.getElementById(to_obj).innerHTML = '렌더링에 실패했습니다. 잠시 후 다시 시도해 주세요.';
-            }
-        });
-}
-
-
 function opennamu_page_control(url, page, data_length, data_length_max = 50) {
     let next = function() {
         if(data_length_max === data_length) {

+ 86 - 0
views/main_css/js/func/render.js

@@ -316,3 +316,89 @@ function opennamu_do_toc() {
         return '<div class="opennamu_TOC" id="toc"><div class="opennamu_TOC_title">TOC</div><br>' + toc_html + '</div>';
     });
 }
+
+function opennamu_do_render(to_obj, data, name = '', do_type = '', option = '', callback = undefined) {
+    let url;
+    if (do_type === '') {
+        url = "/api/render";
+    } else {
+        url = "/api/render/" + do_type;
+    }
+
+    fetch(url, {
+        method: 'POST',
+        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+        body: new URLSearchParams({
+            'name': name,
+            'data': data,
+            'option': option
+        })
+    }).then(response => {
+        if(!response.ok) {
+            throw new Error(`API 호출 실패: ${response.status}`);
+        }
+
+        return response.json();
+    }).then(text => {
+        if(document.getElementById(to_obj)) {
+            if(text["data"]) {
+                document.getElementById(to_obj).innerHTML = text["data"];
+                eval(text["js_data"]);
+            } else {
+                document.getElementById(to_obj).innerHTML = '';
+            }
+
+            if(callback) {
+                callback();
+            }
+        }
+    }).catch(err => {
+        console.error('렌더링 호출 중 오류 발생:', err);
+        if(document.getElementById(to_obj)) {
+            document.getElementById(to_obj).innerHTML = '렌더링에 실패했습니다. 잠시 후 다시 시도해 주세요.';
+        }
+    });
+}
+
+function opennamu_do_render_with_dom(to_obj, from_obj, name = '', do_type = '', option = '', callback = undefined) {
+    let url;
+    if (do_type === '') {
+        url = "/api/render";
+    } else {
+        url = "/api/render/" + do_type;
+    }
+
+    fetch(url, {
+        method: 'POST',
+        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+        body: new URLSearchParams({
+            'name': name,
+            'data': opennamu_xss_filter_decode(document.getElementById(from_obj).innerHTML),
+            'option': option
+        })
+    }).then(response => {
+        if(!response.ok) {
+            throw new Error(`API 호출 실패: ${response.status}`);
+        }
+
+        return response.json();
+    }).then(text => {
+        if(document.getElementById(to_obj)) {
+            if(text["data"]) {
+                document.getElementById(to_obj).innerHTML = text["data"];
+                eval(text["js_data"]);
+            } else {
+                document.getElementById(to_obj).innerHTML = '';
+            }
+
+            if(callback) {
+                callback();
+            }
+        }
+    }).catch(err => {
+        console.error('렌더링 호출 중 오류 발생:', err);
+        if(document.getElementById(to_obj)) {
+            document.getElementById(to_obj).innerHTML = '렌더링에 실패했습니다. 잠시 후 다시 시도해 주세요.';
+        }
+    });
+}

+ 0 - 60
views/main_css/js/route/bbs_in.js

@@ -1,60 +0,0 @@
-"use strict";
-
-function opennamu_bbs_in() {
-    const url = window.location.pathname;
-    const url_split = url.split('/');
-
-    let bbs_num = url_split[3];
-    let page;
-    if(url_split.length > 4) {
-        page = url_split[4];
-    } else {
-        page = '1';
-    }
-
-    fetch('/api/v2/bbs/in/' + bbs_num + '/' + page).then(function(res) {
-        return res.json();
-    }).then(function(data) {
-        data = data["data"];
-
-        let data_html = '';
-
-        for(let for_a = 0; for_a < data.length; for_a++) {
-            data_html += '<div class="opennamu_recent_change">';
-
-            data_html += '<a href="/bbs/w/' + data[for_a]['set_id'] + '/' + data[for_a]['set_code'] + '">' + opennamu_xss_filter(data[for_a]['title']) + '</a>';
-
-            data_html += '<div style="float: right;">';
-
-            data_html += '<span id="opennamu_bbs_comment_' + String(for_a) + '"></span>';
-
-            data_html += data[for_a]['user_id_render'] + ' | ';
-
-            if(data[for_a]['pinned'] === '1') {
-                data_html += '<span style="color: red;">' + data[for_a]['date'] + '</span>';
-            } else {
-                data_html += data[for_a]['date'];
-            }
-
-            data_html += '</div>'
-            data_html += '<div style="clear: both;"></div>';
-
-            data_html += '</div>';
-            data_html += '<hr class="main_hr">';
-        }
-
-        data_html += opennamu_page_control('/bbs/in/' + bbs_num + '/{}', Number(page), data.length);
-        
-        document.getElementById('opennamu_bbs_in').innerHTML = data_html;
-
-        for(let for_a = 0; for_a < data.length; for_a++) {
-            fetch('/api/v2/bbs/w/comment/' + data[for_a]['set_id'] + '-' + data[for_a]['set_code'] + '/length').then(function(res) {
-                return res.json();
-            }).then(function(comment_data) {
-                if(comment_data) {
-                    document.getElementById('opennamu_bbs_comment_' + String(for_a)).innerText = comment_data['data'] + ' | ';
-                }
-            });
-        }
-    });
-}

+ 0 - 118
views/main_css/js/route/bbs_w_post.js

@@ -35,122 +35,4 @@ function opennamu_load_tabom_count(bbs_id, bbs_code) {
             }
         }
     });
-}
-
-function opennamu_load_comment() {
-    const url = window.location.pathname;
-    const url_split = url.split('/');
-
-    let bbs_id = url_split[3];
-    let bbs_code = url_split[4];
-
-    let lang_data = new FormData();
-    lang_data.append('data', 'normal comment tool return upvote');
-
-    fetch('/api/v2/lang', {
-        method : 'POST',
-        body : lang_data,
-    }).then(function(res) {
-        return res.json();
-    }).then(function(lang) {
-        lang = lang["data"];
-
-        fetch('/api/v2/bbs/w/comment/' + bbs_id + '-' + bbs_code + '/normal').then(function(res) {
-            return res.json();
-        }).then(function(data) {
-            let data_html = '';
-
-            if(data) {
-                data = data["data"];
-
-                let end_render = [];
-                let select = '<select id="opennamu_comment_select" name="comment_select">';
-                select += '<option value="0">' + lang["normal"] + '</option>';
-
-                for(let for_a in data) {
-                    let data_in = data[for_a];
-
-                    let code_id = data_in["id"] + '-' + data_in["code"];
-                    code_id = code_id.replace(/^[0-9]+-[0-9]+-/, '');
-
-                    let count = 0;
-                    for(let for_a = 0; for_a < code_id.length; for_a++) {
-                        if(code_id[for_a] === '-') {
-                            count += 1;
-                        }
-                    }
-                    
-                    select += '<option value="' + code_id + '">' + code_id + '</option>';
-
-                    let color = 'default';
-                    let date = '';
-
-                    date += '<a href="javascript:opennamu_change_comment(\'' + code_id + '\');">(' + lang["comment"] + ')</a> ';
-                    date += '<a href="/bbs/tool/' + bbs_id + '/' + bbs_code + '/' + code_id + '">(' + lang["tool"] + ')</a> ';
-                    date += data_in["comment_date"];
-
-                    data_html += '<span style="padding-left: ' + String(20 * count) + 'px;"></span>';
-                    data_html += opennamu_get_thread_ui(
-                        data_in["comment_user_id_render"], 
-                        date, 
-                        '<div class="opennamu_comment_scroll" id="opennamu_thread_render_' + code_id + '">' + opennamu_xss_filter(data_in["comment"]) + '</div>',
-                        code_id,
-                        color,
-                        '',
-                        'width: calc(100% - ' + String(20 * count) + 'px);',
-                        ''
-                    );
-
-                    end_render.push([
-                        data_in["comment"],
-                        code_id
-                    ]);
-                }
-
-                select += '</select> <a href="javascript:opennamu_return_comment();">(' + lang["return"] + ')</a>';
-                select += '<hr class="main_hr">';
-
-                if(document.getElementById('opennamu_bbs_w_post_select')) {
-                    document.getElementById('opennamu_bbs_w_post_select').innerHTML = select;
-                }
-
-                if(document.getElementById('opennamu_bbs_w_post_tabom')) {
-                    document.getElementById('opennamu_bbs_w_post_tabom').innerHTML = '' +
-                        '<a href="javascript:void(0);" id="opennamu_tabom_button">' +
-                            '<span class="opennamu_bbs_w_post_tabom opennamu_svg opennamu_svg_tabom">&nbsp;</span>' +
-                        '</a>' +
-                        '<hr class="main_hr">' +
-                        '<span>' + lang["upvote"] + '</span> <span class="opennamu_tabom_count"></span>' +
-                    '';
-                }
-
-                document.getElementById('opennamu_bbs_w_post').innerHTML = data_html;
-                
-                opennamu_load_tabom_count(bbs_id, bbs_code);
-
-                document.getElementById('opennamu_tabom_button').addEventListener("click", function() {
-                    opennamu_post_tabom(bbs_id, bbs_code);
-                });
-
-                for(let for_a = 0; for_a < end_render.length; for_a++) {
-                    let observer = new IntersectionObserver(entries => {
-                        entries.forEach(entry => {
-                            if(entry.isIntersecting) {
-                                opennamu_do_render(
-                                    'opennamu_thread_render_' + end_render[for_a][1],
-                                    end_render[for_a][0], 
-                                    '',
-                                    'thread'
-                                );
-
-                                observer.unobserve(entry.target);
-                            }
-                        });
-                    });
-
-                    observer.observe(document.getElementById('opennamu_thread_render_' + end_render[for_a][1]));
-                }
-            }
-        });
-    });
 }

+ 0 - 155
views/main_css/js/route/list_recent_block.js

@@ -1,155 +0,0 @@
-"use strict";
-
-function opennamu_list_recent_block() {
-    const url = window.location.pathname;
-    const url_split = url.split('/');
-
-    let tool = 'all';
-    let page = '1';
-    let user_name = '';
-    let why = '';
-    let add_path = '';
-    if(url_split.length > 2) {
-        tool = url_split[2];
-
-        if(tool === 'user' || tool === 'admin') {
-            add_path = '_user';
-
-            if(url_split.length > 3) {
-                user_name = '/' + url_split[3];
-
-                if(url_split.length > 4) {
-                    page = url_split[4];
-                }
-            }
-        } else {
-            if(url_split.length > 3) {
-                page = url_split[3];
-
-                if(url_split.length > 4) {
-                    why = '/' + url_split.slice(4).join('/');
-                }
-            }
-        }
-    }
-
-    let lang_data = new FormData();
-    lang_data.append('data', ["data", 'private', 'cidr', 'regex', "release", "limitless"].join(' '));
-
-    fetch('/api/v2/lang', {
-        method : 'POST',
-        body : lang_data,
-    }).then(function(res) {
-        return res.json();
-    }).then(function(lang) {
-        lang = lang["data"];
-
-        fetch('/api/v2/recent_block' + add_path + '/' + tool + '/' + page + user_name + why).then(function(res) {
-            return res.json();
-        }).then(function(data) {
-            let auth = data["auth"];
-            data = data["data"];
-
-            let data_html = '';
-
-            let option_list = [['all', 'all'], ['regex', 'regex'], ['cidr', 'cidr'], ['private', 'private'], ['ongoing', 'in_progress']];
-            for(let for_a = 0; for_a < option_list.length; for_a++) {
-                data_html += '<a href="/recent_block/' + option_list[for_a][0] + '">(' + lang[option_list[for_a][1]] + ')</a> ';
-            }
-
-            option_list = [['/manager/11', 'blocked'], ['/manager/12', 'admin'], ['/manager/19', 'why']];
-            for(let for_a = 0; for_a < option_list.length; for_a++) {
-                data_html += '<a href="' + option_list[for_a][0] + '">(' + lang[option_list[for_a][1]] + ')</a> ';
-            }
-
-            data_html += '<hr class="main_hr">';
-
-            /*
-                data_list = append(data_list, []string{
-                    why,
-                    ip_pre_block,
-                    ip_render_block,
-                    ip_pre_blocker,
-                    ip_render_blocker,
-                    end,
-                    today,
-                    band,
-                    ongoing,
-                })
-            */
-            for(let for_a = 0; for_a < data.length; for_a++) {
-                let left = '';
-
-                let ban_auth = (auth["owner"] === true || auth["ban"] === true);
-                let ip = data[for_a][1];
-                if(data[for_a][7] === '') {
-                    if(ban_auth) {
-                        ip = '<a href="/auth/ban/' + opennamu_do_url_encode(data[for_a][1]) + '">' + ip + '</a>';
-                    }
-                    
-                    if(data[for_a][8] === '1') {
-                        ip = '<s>' + ip + '</s>';
-                    }
-                } else if(data[for_a][7] === 'private') {
-                    if(ban_auth) {
-                        ip = '<a href="/auth/ban/' + opennamu_do_url_encode(data[for_a][1]) + '">' + ip + '</a>';
-                    }
-
-                    if(data[for_a][8] === '1') {
-                        ip = '<s>' + ip + '</s>';
-                    }
-
-                    ip += ' (' + lang['private'] + ')';
-                } else if(data[for_a][7] === 'cidr') {
-                    if(ban_auth) {
-                        ip = '<a href="/auth/ban_cidr/' + opennamu_do_url_encode(data[for_a][1]) + '">' + ip + '</a>';
-                    }
-
-                    if(data[for_a][8] === '1') {
-                        ip = '<s>' + ip + '</s>';
-                    }
-
-                    ip += ' (' + lang['cidr'] + ')';
-                } else {
-                    if(ban_auth) {
-                        ip = '<a href="/auth/ban_regex/' + opennamu_do_url_encode(data[for_a][1]) + '">' + ip + '</a>';
-                    }
-
-                    if(data[for_a][8] === '1') {
-                        ip = '<s>' + ip + '</s>';
-                    }
-
-                    ip += ' (' + lang['regex'] + ')';
-                }
-                
-                left += ip + ' ← ' + data[for_a][4];
-
-                let end = "";
-                if(data[for_a][5] === "release") {
-                    end = lang["release"];
-                } else if(data[for_a][5] === "") {
-                    end = lang["limitless"];
-                } else {
-                    end = data[for_a][5];
-                }
-
-                let right = end + '<br>' + data[for_a][6];
-
-                let bottom = '';
-                if(data[for_a][0] !== "") {
-                    if(data[for_a][0] === "edit filter") {
-                        bottom = '<a href="/edit_filter/' + opennamu_do_url_encode(data[for_a][1]) + '">edit filter</a>'
-                    } else {
-                        bottom = opennamu_send_render(opennamu_xss_filter(data[for_a][0]));
-                    }
-                }
-
-                data_html += opennamu_make_list(left, right, bottom);
-            }
-
-            data_html += opennamu_page_control('/recent_block/' + tool + user_name + '/{}' + why, Number(page), data.length);
-
-            document.getElementById('opennamu_list_recent_block').innerHTML = data_html;
-        });
-    });
-}

+ 0 - 93
views/main_css/js/route/list_recent_discuss.js

@@ -1,93 +0,0 @@
-"use strict";
-
-function opennamu_list_recent_discuss() {
-    const url = window.location.pathname;
-    const url_split = url.split('/');
-    
-    let set_type = '';
-    let num = '';
-    if(url_split.length === 2) {
-        set_type = 'normal';
-        num = '1';
-    } else {
-        set_type = url_split[3];
-        num = url_split[2];
-    }
-
-    let lang_data = new FormData();
-    lang_data.append('data', 'normal close_discussion open_discussion admin_tool closed stop agreed_discussion');
-
-    fetch('/api/v2/lang', {
-        method : 'POST',
-        body : lang_data,
-    }).then(function(res) {
-        return res.json();
-    }).then(function(lang) {
-        lang = lang["data"];
-        
-        fetch('/api/v2/recent_discuss/' + set_type + '/' + num).then(function(res) {
-            return res.json();
-        }).then(function(data) {
-            let auth = data["auth"];
-            data = data["data"];
-
-            let data_html = '';
-
-            let option_list = [
-                ['normal', lang['normal']],
-                ['close', lang['close_discussion']],
-                ['open', lang['open_discussion']]
-            ];
-            for(let for_a = 0; for_a < option_list.length; for_a++) {
-                data_html += '<a href="/recent_discuss/1/' + option_list[for_a][0] + '">(' + option_list[for_a][1] + ')</a> ';
-            }
-
-            data_html += '<hr class="main_hr">';
-
-            if(auth["hidel"] === true) {
-                data_html += '<a id="opennamu_list_admin_tool_button" href="javascript:void(0);">(' + lang["admin_tool"] + ')</a>';
-
-                data_html += '<span id="opennamu_list_admin_tool" style="display: none;">';
-                data_html += 'test';
-                data_html += '</span>';
-
-                data_html += '<span class="opennamu_popup_footnote" style="display: none;" id="opennamu_list_admin_tool_button_load">';
-                data_html += '</span>';
-
-                data_html += '<hr class="main_hr">';
-            }
-
-            for(let for_a = 0; for_a < data.length; for_a++) {
-                let doc_name = opennamu_do_url_encode(data[for_a][0]);
-
-                let left = '<a href="/thread/' + data[for_a][3] + '">' + opennamu_xss_filter(data[for_a][1]) + '</a> ';
-                left += '<a href="/w/' + doc_name + '">(' + opennamu_xss_filter(data[for_a][0]) + ')</a> ';
-
-                if(auth["hidel"] === true) {
-                    left = '<label><input type="checkbox"> ' + left + '</label>';
-                }
-
-                let right = '';
-                if(data[for_a][4] === 'O') {
-                    right += lang['closed'] + ' | ';
-                } else if(data[for_a][4] === 'S') {
-                    right += lang['stop'] + ' | ';
-                }
-
-                if(data[for_a][8] !== '') {
-                    right += lang['agreed_discussion'] + ' | ';
-                }
-
-                right += '<a href="/thread/' + data[for_a][3] + '#' + data[for_a][7] + '">#' + data[for_a][7] + '</a> | ';
-                right += data[for_a][6] + ' | ';
-                right += data[for_a][2];
-
-                data_html += opennamu_make_list(left, right);
-            }
-
-            data_html += opennamu_page_control('/recent_discuss/{}/' + set_type, Number(num), data.length);
-
-            document.getElementById('opennamu_list_recent_discuss').innerHTML = data_html;
-        });
-    });
-}

+ 124 - 124
views/ringo/index.html

@@ -1,43 +1,43 @@
-<!DOCTYPE html>
-<html lang="{{'language_tag'|load_lang}}">
-    <head>
-        <style id="ringo_add_style"></style>
-        <script src="/views/ringo/js/skin_set_do.js.cache_v4"></script>
-        <meta charset="utf-8">
-        {% if sub_title != 0 %}
-            <title>{{title}} {{sub_title}} - {{wiki_name}}</title>
-        {% else %}
-            <title>{{title}} - {{wiki_name}}</title>
-        {% endif %}
-        {{main_head|safe}}
-        <link href="https://cdn.jsdelivr.net/gh/sun-typeface/SUIT/fonts/static/woff2/SUIT.css" rel="stylesheet">
-        <script defer src="https://code.iconify.design/1/1.0.3/iconify.min.js"></script>
-        <script defer src="/views/ringo/js/main.js.cache_v3"></script>
-        <script defer src="/views/ringo/js/sidebar.js.cache_v7"></script>
-        <script defer src="/views/ringo/js/skin_set.js.cache_v9"></script>
-        <link rel="stylesheet" href="/views/ringo/css/main.css.cache_v13">
-        {% if main_head_dark != '' %}
-            {{main_head_dark|safe}}
-            <link rel="stylesheet" href="/views/ringo/css/dark.css.cache_v3">
-        {% endif %}
-        <link rel="shortcut icon" href="/views/main_css/file/favicon.ico.cache_v1">
-        {{global_head|safe}}
-        {{user_head|safe}}
-        {% if sub_title != 0 %}
-            <meta name="title" content="{{title}}{{sub_title}} - {{wiki_name}}">
-        {% else %}
-            <meta name="title" content="{{title}} - {{wiki_name}}">
-        {% endif %}
-        <meta name="keywords" content="{{title}}">
-        <meta name="description" content="{{description_doc}}">
-        <meta name="viewport" content="width=device-width, initial-scale=1">
-    </head>
+<!DOCTYPE html>
+<html lang="{{'language_tag'|load_lang}}">
+    <head>
+        <style id="ringo_add_style"></style>
+        <script src="/views/ringo/js/skin_set_do.js.cache_v4"></script>
+        <meta charset="utf-8">
+        {% if sub_title != 0 %}
+            <title>{{title}} {{sub_title}} - {{wiki_name}}</title>
+        {% else %}
+            <title>{{title}} - {{wiki_name}}</title>
+        {% endif %}
+        {{main_head|safe}}
+        <link href="https://cdn.jsdelivr.net/gh/sun-typeface/SUIT/fonts/static/woff2/SUIT.css" rel="stylesheet">
+        <script defer src="https://code.iconify.design/1/1.0.3/iconify.min.js"></script>
+        <script defer src="/views/ringo/js/main.js.cache_v3"></script>
+        <script defer src="/views/ringo/js/sidebar.js.cache_v7"></script>
+        <script defer src="/views/ringo/js/skin_set.js.cache_v9"></script>
+        <link rel="stylesheet" href="/views/ringo/css/main.css.cache_v13">
+        {% if main_head_dark != '' %}
+            {{main_head_dark|safe}}
+            <link rel="stylesheet" href="/views/ringo/css/dark.css.cache_v3">
+        {% endif %}
+        <link rel="shortcut icon" href="/views/main_css/file/favicon.ico.cache_v1">
+        {{global_head|safe}}
+        {{user_head|safe}}
+        {% if sub_title != 0 %}
+            <meta name="title" content="{{title}}{{sub_title}} - {{wiki_name}}">
+        {% else %}
+            <meta name="title" content="{{title}} - {{wiki_name}}">
+        {% endif %}
+        <meta name="keywords" content="{{title}}">
+        <meta name="description" content="{{description_doc}}">
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+    </head>
     <body>
         <header id="main">
-            <span id="left">
-                <a id="logo" href="/">{{wiki_logo|safe}}</a>
-            </span>
-            <span id="right">
+            <span id="left">
+                <a id="logo" href="/">{{wiki_logo|safe}}</a>
+            </span>
+            <span id="right">
                 <div class="top_cel" id="recent_cel">
                     <a href="javascript:ringo_opening('recent_cel_in');">
                         <span class="iconify" data-icon="ic:baseline-access-time" data-inline="true"></span>
@@ -78,10 +78,10 @@
                             <span class="iconify" data-icon="ic:baseline-build" data-inline="true"></span>
                             {{'other_tool'|load_lang}}
                         </a>
-                        {% if user_auth != '0' %}
-                            <a href="/manager">
-                                <span class="iconify" data-icon="ic:baseline-how-to-reg" data-inline="true"></span>
-                                {{'admin_tool'|load_lang}}
+                        {% if user_auth != '0' %}
+                            <a href="/manager">
+                                <span class="iconify" data-icon="ic:baseline-how-to-reg" data-inline="true"></span>
+                                {{'admin_tool'|load_lang}}
                             </a>
                         {% endif %}
                         <a href="/upload">
@@ -95,20 +95,20 @@
                     </div>
                 </div>
                 <div class="top_cel" id="user_cel">
-                    <a href="javascript:ringo_opening('user_cel_in');">
-                        {% if user_login == 1 %}
-                            {% if user_alarm_count != '0' %}
-                                <span class="iconify" data-icon="ic:baseline-add-alert" data-inline="true"></span>
-                            {% else %}
-                                <span class="iconify" data-icon="ic:baseline-person-add" data-inline="true"></span>
-                            {% endif %}
-                        {% else %}
-                            <span class="iconify" data-icon="ic:round-person-search" data-inline="true"></span>
-                        {% endif %}
-                        <span class="not_mobile">{{user_name}}</span>
-                        <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
-                    </a>
-                    <div class="top_cel_in" id="user_cel_in" style="display: none;">
+                    <a href="javascript:ringo_opening('user_cel_in');">
+                        {% if user_login == 1 %}
+                            {% if user_alarm_count != '0' %}
+                                <span class="iconify" data-icon="ic:baseline-add-alert" data-inline="true"></span>
+                            {% else %}
+                                <span class="iconify" data-icon="ic:baseline-person-add" data-inline="true"></span>
+                            {% endif %}
+                        {% else %}
+                            <span class="iconify" data-icon="ic:round-person-search" data-inline="true"></span>
+                        {% endif %}
+                        <span class="not_mobile">{{user_name}}</span>
+                        <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
+                    </a>
+                    <div class="top_cel_in" id="user_cel_in" style="display: none;">
                         <a href="/user">
                             <span class="iconify" data-icon="ic:baseline-account-box" data-inline="true"></span>
                             {{'user_tool'|load_lang}}
@@ -117,14 +117,14 @@
                             <span class="iconify" data-icon="ic:baseline-manage-accounts" data-inline="true"></span>
                             {{'user_setting'|load_lang}}
                         </a>
-                        {% if user_login == 1 %}
-                            <a href="/alarm">
-                                <span class="iconify" data-icon="ic:baseline-contact-mail" data-inline="true"></span>
-                                {{'alarm'|load_lang}} ({{user_alarm_count}})
-                            </a>
-                            <a href="/watch_list">
-                                <span class="iconify" data-icon="ic:round-preview" data-inline="true"></span>
-                                {{'watchlist'|load_lang}}
+                        {% if user_login == 1 %}
+                            <a href="/alarm">
+                                <span class="iconify" data-icon="ic:baseline-contact-mail" data-inline="true"></span>
+                                {{'alarm'|load_lang}} ({{user_alarm_count}})
+                            </a>
+                            <a href="/watch_list">
+                                <span class="iconify" data-icon="ic:round-preview" data-inline="true"></span>
+                                {{'watchlist'|load_lang}}
                             </a>
                             <a href="/star_doc">
                                 <span class="iconify" data-icon="ic:twotone-stars" data-inline="true"></span>
@@ -144,19 +144,19 @@
                                 {{'register'|load_lang}}
                             </a>
                         {% endif %}
-                    </div>
-                </div>
-                {% if add_menu != '' %}
-                    <div class="top_cel" id="add_cel">
-                        <a href="javascript:ringo_opening('add_cel_in');">
-                            <span class="iconify" data-icon="ic:baseline-playlist-add" data-inline="true"></span>
-                            <span class="not_mobile">{{'added_menu'|load_lang}}</span>
-                            <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
-                        </a>
-                        <div class="top_cel_in" id="add_cel_in" style="display: none;">
-                            {% for added_top_menu in add_menu %}
-                                <a href="{{added_top_menu[1]}}">
-                                    <span class="iconify" data-icon="ic:baseline-plus" data-inline="true"></span>
+                    </div>
+                </div>
+                {% if add_menu != '' %}
+                    <div class="top_cel" id="add_cel">
+                        <a href="javascript:ringo_opening('add_cel_in');">
+                            <span class="iconify" data-icon="ic:baseline-playlist-add" data-inline="true"></span>
+                            <span class="not_mobile">{{'added_menu'|load_lang}}</span>
+                            <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
+                        </a>
+                        <div class="top_cel_in" id="add_cel_in" style="display: none;">
+                            {% for added_top_menu in add_menu %}
+                                <a href="{{added_top_menu[1]}}">
+                                    <span class="iconify" data-icon="ic:baseline-plus" data-inline="true"></span>
                                     {{added_top_menu[0]}}
                                 </a>
                             {% endfor %}
@@ -185,19 +185,19 @@
         </header>
         <section>
             <header id="section">
-                <article class="main" id="title">
-                    <h1 class="blank">
-                        <span class="change_space">{{title}}</span>
-                        {% if sub_title != 0 %}
-                            <sub>{{sub_title}}</sub>
-                        {% endif %}
-                    </h1>
-                    {% if last_edit != 0 %}
-                        {{'last_edit_time'|load_lang}} : {{last_edit}}
-                        {% if view_count != 0 %}
-                            | {{'page_view'|load_lang}} : {{view_count}}
-                        {% endif %}
-                    {% endif %}
+                <article class="main" id="title">
+                    <h1 class="blank">
+                        <span class="change_space">{{title}}</span>
+                        {% if sub_title != 0 %}
+                            <sub>{{sub_title}}</sub>
+                        {% endif %}
+                    </h1>
+                    {% if last_edit != 0 %}
+                        {{'last_edit_time'|load_lang}} : {{last_edit}}
+                        {% if view_count != 0 %}
+                            | {{'page_view'|load_lang}} : {{view_count}}
+                        {% endif %}
+                    {% endif %}
                     {% if menu != 0 %}
                         <div id="menu">
                             {% for menu_data in menu %}
@@ -220,33 +220,33 @@
                         </div>
                     {% endif %}
                 </article>
-            </header>
-            <article class="main" id="main_data">
-                {{template_var_1|safe}}
-                {{data|safe}}
-                {{template_var_3|safe}}
-            </article>
-            <footer class="not_mobile">
-                <article class="main" id="footer">
-                    {{license|safe}}
-                    <br>
-                    <br>
-                    <a href="https://github.com/openNAMU/openNAMU"><img alt="b_logo" id="b_logo" src="/views/main_css/file/s_logo.png"></a>
+            </header>
+            <article class="main" id="main_data">
+                {{template_var_1|safe}}
+                {{data|safe}}
+                {{template_var_3|safe}}
+            </article>
+            <footer class="not_mobile">
+                <article class="main" id="footer">
+                    {{license|safe}}
+                    <br>
+                    <br>
+                    <a href="https://github.com/openNAMU/openNAMU"><img alt="b_logo" id="b_logo" src="/views/main_css/file/s_logo.webp"></a>
                 </article>
-            </footer>
-        </section>
-        <aside class="do_fixed">
-            {% if template_var_2 == '' %}
-                <button id="side_button_1" class="side_button selected">{{'edit'|load_lang}}</button><!--
-             --><button id="side_button_2" class="side_button">{{'discussion'|load_lang}}</button><!--
-             --><button id="side_button_3" class="side_button">{{'bbs'|load_lang}}</button>
-                <div id="side_content">
-                    Loading...
-                </div>
-            {% else %}
-                {{template_var_2|safe}}
-            {% endif %}
-        </aside>
+            </footer>
+        </section>
+        <aside class="do_fixed">
+            {% if template_var_2 == '' %}
+                <button id="side_button_1" class="side_button selected">{{'edit'|load_lang}}</button><!--
+             --><button id="side_button_2" class="side_button">{{'discussion'|load_lang}}</button><!--
+             --><button id="side_button_3" class="side_button">{{'bbs'|load_lang}}</button>
+                <div id="side_content">
+                    Loading...
+                </div>
+            {% else %}
+                {{template_var_2|safe}}
+            {% endif %}
+        </aside>
         <div id="nav_bar">
             <div id="go_top">
                 <a href="#main">
@@ -263,12 +263,12 @@
                     <span class="iconify" data-icon="ic:baseline-list" data-inline="true"></span>
                 </a>
             </div>
-        </div>
-        <footer class="only_mobile" id="footer">
-            {{license|safe}}
-            <br>
-            <br>
-            <a href="https://github.com/openNAMU/openNAMU"><img alt="b_logo" id="b_logo" src="/views/main_css/file/logo.svg"></a>
-        </footer>
+        </div>
+        <footer class="only_mobile" id="footer">
+            {{license|safe}}
+            <br>
+            <br>
+            <a href="https://github.com/openNAMU/openNAMU"><img alt="b_logo" id="b_logo" src="/views/main_css/file/logo.svg"></a>
+        </footer>
     </body>
-</html>
+</html>