Procházet zdrojové kódy

대거 Go로 이전

spdv před 1 měsícem
rodič
revize
fc51a944cf

+ 18 - 18
app.py

@@ -853,7 +853,7 @@ 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/make', methods = ['POST', 'GET'])(golang_view())
 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)
@@ -864,14 +864,14 @@ 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)
+app.route('/bbs/delete/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(golang_view())
 app.route('/bbs/raw/<int:bbs_num>/<int:post_num>')(view_raw)
-app.route('/bbs/tool/<int:bbs_num>/<int:post_num>')(bbs_w_tool)
+app.route('/bbs/tool/<int:bbs_num>/<int:post_num>')(golang_view())
 app.route('/bbs/edit/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_edit)
-app.route('/bbs/tool/<int:bbs_num>/<int:post_num>/<comment_num>')(bbs_w_comment_tool)
+app.route('/bbs/tool/<int:bbs_num>/<int:post_num>/<comment_num>')(golang_view())
 app.route('/bbs/raw/<int:bbs_num>/<int:post_num>/<comment_num>')(view_raw)
 app.route('/bbs/edit/<int:bbs_num>/<int:post_num>/<comment_num>', methods = ['POST', 'GET'])(bbs_w_edit)
-app.route('/bbs/delete/<int:bbs_num>/<int:post_num>/<comment_num>', methods = ['POST', 'GET'])(bbs_w_delete)
+app.route('/bbs/delete/<int:bbs_num>/<int:post_num>/<comment_num>', methods = ['POST', 'GET'])(golang_view())
 
 # Func-api
 ## v1 API
@@ -906,22 +906,22 @@ app.route('/api/recent_changes')(golang_view())
 app.route('/api/recent_change/<int:limit>')(golang_view())
 app.route('/api/recent_change/<int:limit>/<set_type>/<int:num>')(golang_view())
 
-app.route('/api/recent_edit_request')(api_list_recent_edit_request_exter)
-app.route('/api/recent_edit_request/<int:limit>/<set_type>/<int:num>')(api_list_recent_edit_request_exter)
+app.route('/api/recent_edit_request')(golang_view())
+app.route('/api/recent_edit_request/<int:limit>/<set_type>/<int:num>')(golang_view())
 
 app.route('/api/recent_discuss/<set_type>/<int:limit>')(golang_view())
 app.route('/api/recent_discuss/<int:limit>')(golang_view())
 app.route('/api/recent_discuss')(golang_view())
 
-app.route('/api/lang', methods = ['POST'])(api_func_language_exter)
-app.route('/api/lang/<data>')(api_func_language_exter)
+app.route('/api/lang', methods = ['POST'])(golang_view())
+app.route('/api/lang/<data>')(golang_view())
 app.route('/api/sha224/<everything:data>')(golang_view())
-app.route('/api/ip/<everything:data>')(api_func_ip)
+app.route('/api/ip/<everything:data>')(golang_view())
 
 app.route('/api/image/<everything:name>')(api_image_view)
 
 ## v2 API
-app.route('/api/v2/recent_edit_request/<set_type>/<int:num>', defaults = { 'limit' : 50 })(api_list_recent_edit_request)
+app.route('/api/v2/recent_edit_request/<set_type>/<int:num>')(golang_view())
 app.route('/api/v2/recent_change/<set_type>/<int:num>')(golang_view())
 app.route('/api/v2/recent_discuss/<set_type>/<int:num>')(golang_view())
 app.route('/api/v2/recent_block/<set_type>/<int:num>')(golang_view())
@@ -933,7 +933,7 @@ app.route('/api/v2/list/document/new/<int:num>')(golang_view())
 app.route('/api/v2/list/document/<int:num>')(golang_view())
 app.route('/api/v2/list/auth')(golang_view())
 app.route('/api/v2/list/markup')(golang_view())
-app.route('/api/v2/list/acl/<data_type>')(api_list_acl)
+app.route('/api/v2/list/acl/<data_type>')(golang_view())
 app.route('/api/v2/history/<int:num>/<set_type>/<everything:doc_name>')(golang_view())
 
 app.route('/api/v2/topic/<int:num>/<set_type>/<everything:name>')(golang_view())
@@ -960,17 +960,17 @@ app.route('/api/v2/page_view_post/<everything:name>')(golang_view())
 
 app.route('/api/v2/setting/<name>', methods = ['GET', 'PUT'])(api_setting_exter)
 
-app.route('/api/v2/auth')(api_func_auth_exter)
-app.route('/api/v2/auth/<user_name>')(api_func_auth_exter)
+app.route('/api/v2/auth')(golang_view())
+app.route('/api/v2/auth/<user_name>')(golang_view())
 app.route('/api/v2/auth/give', methods = ['PATCH'])(golang_view())
 
 app.route('/api/v2/user/rankup', methods = ['GET', 'PATCH'])(golang_view())
 app.route('/api/v2/user/setting/editor', methods = ['GET', 'POST', 'DELETE'])(golang_view())
 
-app.route('/api/v2/ip/<everything:data>', methods = ['GET', 'POST'])(api_func_ip)
-app.route('/api/v2/ip_menu/<everything:ip>', defaults = { 'option' : 'user' }, methods = ['GET', 'POST'])(api_func_ip_menu)
-app.route('/api/v2/user_menu/<everything:ip>')(api_func_ip_menu)
-app.route('/api/v2/lang', defaults = { 'legacy' : '' }, methods = ['POST'])(api_func_language_exter)
+app.route('/api/v2/ip/<everything:data>', methods = ['GET', 'POST'])(golang_view())
+app.route('/api/v2/ip_menu/<everything:ip>', methods = ['GET', 'POST'])(golang_view())
+app.route('/api/v2/user_menu/<everything:ip>')(golang_view())
+app.route('/api/v2/lang', methods = ['POST'])(golang_view())
 
 app.route('/api/v2/raw_exist/<everything:name>')(golang_view())
 app.route('/api/v2/raw_rev/<int(signed = True):rev>/<everything:name>')(golang_view())

+ 0 - 15
route/__init__.py

@@ -6,7 +6,6 @@ from route.bbs_w_edit import bbs_w_edit
 from route.bbs_make import bbs_make
 # from route.bbs_w_hide import bbs_w_hide
 from route.bbs_w_pinned import bbs_w_pinned
-from route.bbs_w_delete import bbs_w_delete
 from route.bbs_w import bbs_w
 from route.bbs_delete import bbs_delete
 # from route.bbs_hide import bbs_hide
@@ -144,29 +143,15 @@ from route.vote_list import vote_list
 from route.vote_select import vote_select
 
 from route.n_list_user_check_submit import list_user_check_submit
-
 from route.n_give_auth import give_auth
-
 from route.n_bbs_w_set import bbs_w_set
-
 from route.n_edit_move_all import edit_move_all
 
-from route.go_api_func_language import api_func_language, api_func_language_exter
-from route.go_api_func_ip import api_func_ip
-from route.go_api_func_ip_menu import api_func_ip_menu
-from route.go_api_func_auth import api_func_auth, api_func_auth_exter
-from route.go_api_func_email import api_func_email, api_func_email_exter
-
-from route.go_api_list_recent_edit_request import api_list_recent_edit_request, api_list_recent_edit_request_exter
-from route.go_api_list_acl import api_list_acl
-
 from route.go_api_bbs_w import api_bbs_w
 from route.go_api_bbs_w_set import api_bbs_w_set
 from route.go_api_bbs_w_comment import api_bbs_w_comment, api_bbs_w_comment_exter
 from route.go_api_bbs_w_comment_one import api_bbs_w_comment_one, api_bbs_w_comment_one_exter
 
 from route.go_api_setting import api_setting, api_setting_exter
-
 from route.go_api_topic import api_topic
-
 from route.go_api_w_render import api_w_render, api_w_render_exter

+ 0 - 42
route/bbs_make.py

@@ -1,42 +0,0 @@
-from .tool.func import *
-
-async def bbs_make():   
-    with get_db_connect() as conn:
-        curs = conn.cursor()
-
-        if await acl_check('', 'owner_auth', '', '') == 1:
-            return await re_error(conn, 3)
-        
-        if flask.request.method == 'POST':
-            curs.execute(db_change('select set_id from bbs_set where set_name = "bbs_name" order by set_id + 0 desc'))
-            db_data = curs.fetchall()
-
-            bbs_num = str(int(db_data[0][0]) + 1) if db_data else '1'
-            bbs_name = flask.request.form.get('bbs_name', 'test')
-            bbs_type = flask.request.form.get('bbs_type', 'comment')
-            bbs_type = bbs_type if bbs_type in ['comment', 'thread'] else 'comment'
-
-            curs.execute(db_change("insert into bbs_set (set_name, set_code, set_id, set_data) values ('bbs_name', '', ?, ?)"), [bbs_num, bbs_name])
-            curs.execute(db_change("insert into bbs_set (set_name, set_code, set_id, set_data) values ('bbs_type', '', ?, ?)"), [bbs_num, bbs_type])
-
-            return redirect(conn, '/bbs/main')
-        else:
-            return await render_template(
-                await get_lang('bbs_make'),
-                '''
-                    <form method="post">
-                        <input class="__ON_INPUT__" placeholder="''' + await get_lang('bbs_name') + '''" name="bbs_name">
-                        <hr class="main_hr">
-                        
-                        <span class="__ON_SELECT_DIV__"><select class="__ON_SELECT__" name="bbs_type">
-                            <option value="comment">''' + await get_lang('comment_base') + '''</option>
-                            <option value="thread">''' + await get_lang('thread_base') + '''</option>
-                        </select></span>
-                        <hr class="main_hr">
-                        
-                        <button class="__ON_BUTTON__" type="submit">''' + await get_lang('save') + '''</button>
-                    </form>
-                ''',
-                0,
-                [['bbs/main', await get_lang('return')]]
-            )

+ 0 - 31
route/bbs_w_comment_tool.py

@@ -1,31 +0,0 @@
-from .tool.func import *
-
-async def bbs_w_comment_tool(bbs_num = '', post_num = '', comment_num = ''):
-    with get_db_connect() as conn:
-        data = ''
-        
-        bbs_num_str = str(bbs_num)
-        post_num_str = str(post_num)
-        
-        data += '''
-            <h2>''' + await get_lang('tool') + '''</h2>
-            <ul>
-                <li><a href="/bbs/raw/''' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str) + '/' + url_pas(comment_num) + '">' + await get_lang('raw') + '''</a></li>
-                <li><a href="/bbs/edit/''' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str) + '/' + url_pas(comment_num) + '">' + await get_lang('edit') + '''</a></li>
-            </ul>
-        '''
-
-        if await acl_check('', 'owner_auth', '', '') != 1:
-            data += '''
-                <h3>''' + await get_lang('owner') + '''</h2>
-                <ul>
-                    <li><a href="/bbs/delete/''' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str) + '/' + url_pas(comment_num) + '">' + await get_lang('delete') + '''</a></li>
-                </ul>
-            '''
-
-        return await render_template(
-            await get_lang('bbs_comment_tool'),
-            data,
-            0,
-            [['bbs/w/' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str) + '#' + url_pas(comment_num), await get_lang('return')]]
-        )

+ 0 - 67
route/bbs_w_delete.py

@@ -1,67 +0,0 @@
-from .tool.func import *
-
-from .go_api_bbs_w import api_bbs_w
-
-async def bbs_w_delete(bbs_num = '', post_num = '', comment_num = ''):
-    with get_db_connect() as conn:
-        curs = conn.cursor()
-
-        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]
-        
-        bbs_num_str = str(bbs_num)
-        post_num_str = str(post_num)
-
-        if await acl_check('', 'owner_auth', '') == 1:
-            return redirect(conn, '/bbs/in/' + bbs_num_str)
-        
-        temp_dict = await api_bbs_w(bbs_num_str + '-' + post_num_str)
-        if not 'user_id' in temp_dict:
-            return redirect(conn, '/bbs/main')
-        
-        if flask.request.method == 'POST':
-            if comment_num == '':
-                curs.execute(db_change('delete from bbs_data where set_code = ? and set_id = ?'), [post_num_str, bbs_num_str])
-                curs.execute(db_change('delete from bbs_set where set_code = ? and set_id = ?'), [post_num_str, bbs_num_str])
-                curs.execute(db_change('delete from bbs_data where set_id = ? or set_id like ?'), [bbs_num_str + '-' + post_num_str, bbs_num_str + '-' + post_num_str + '-%'])
-                
-                return redirect(conn, '/bbs/in/' + bbs_num_str)
-            else:
-                comment_num_split = comment_num.split('-')
-                
-                set_id = bbs_num_str + '-' + post_num_str
-                set_id_sub = '-'.join(comment_num_split[:-1])
-                if set_id_sub != '':
-                    set_id += '-' + set_id_sub
-
-                set_code = comment_num_split[len(comment_num_split) - 1]
-
-                curs.execute(db_change("update bbs_data set set_data = '' where set_code = ? and set_id = ?"), [set_code, set_id])
-                
-                return redirect(conn, '/bbs/w/' + bbs_num_str + '/' + post_num_str)
-        else:
-            sub = '(' + bbs_name + ')'
-            sub += ' (' + post_num_str + ')'
-            
-            name = await get_lang('bbs_comment_delete')
-            if comment_num == '':
-                name = await get_lang('bbs_post_delete')
-            else:
-                sub += ' (' + comment_num + ')'
-
-            return await render_template(
-                name,
-                await render_simple_set('''
-                    <form method="post">
-                        <span>''' + await get_lang('delete_warning') + '''</span>
-                        <hr class="main_hr">
-                        <button class="__ON_BUTTON__" type="submit">''' + await get_lang('delete') + '''</button>
-                    </form>
-                '''),
-                sub,
-                [['bbs/w/' + bbs_num_str + '/' + post_num_str, await get_lang('return')]]
-            )

+ 0 - 43
route/bbs_w_tool.py

@@ -1,43 +0,0 @@
-from .tool.func import *
-
-async def bbs_w_tool(bbs_num = '', post_num = ''):
-    with get_db_connect() as conn:
-        curs = conn.cursor()
-
-        data = ''
-        
-        bbs_num_str = str(bbs_num)
-        post_num_str = str(post_num)
-        
-        data += '''
-            <h2>''' + await get_lang('tool') + '''</h2>
-            <ul>
-                <li><a href="/bbs/raw/''' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str) + '">' + await get_lang('raw') + '''</a></li>
-            </ul>
-        '''
-
-        if await acl_check('', 'bbs_auth', '', '') != 1:
-            curs.execute(db_change('select set_data from bbs_data where set_code = ? and set_id = ? and set_name = "pinned"'), [post_num_str, bbs_num_str])
-            pinned = await get_lang('pinned') if not curs.fetchall() else await get_lang('pinned_release')
-
-            data += '''
-                <h3>''' + await get_lang('admin') + '''</h3>
-                <ul>
-                    <!-- <li><a href="/bbs/blind/''' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str) + '">' + await get_lang('hide') + '''</a></li> -->
-                    <li><a href="/bbs/pinned/''' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str) + '">' + pinned + '''</a></li>
-                </ul>
-            '''
-
-            data += '''
-                <h3>''' + await get_lang('owner') + '''</h2>
-                <ul>
-                    <li><a href="/bbs/delete/''' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str) + '">' + await get_lang('delete') + '''</a></li>
-                </ul>
-            '''
-
-        return await render_template(
-            await get_lang('bbs_post_tool'),
-            data,
-            0,
-            [['bbs/w/' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str), await get_lang('return')]]
-        )

+ 0 - 10
route/go_api_func_auth.py

@@ -1,10 +0,0 @@
-from .tool.func import *
-
-async def api_func_auth(user_name = ''):
-    other_set = {}
-    other_set["ip"] = ip_check() if user_name == '' else user_name
-
-    return await python_to_golang(sys._getframe().f_code.co_name, other_set)
-
-async def api_func_auth_exter(user_name = ''):
-    return flask.jsonify(await api_func_auth(user_name))

+ 0 - 18
route/go_api_func_email.py

@@ -1,18 +0,0 @@
-from .tool.func import *
-
-async def api_func_email():
-    if flask.request.method == 'POST':
-        func_name = sys._getframe().f_code.co_name
-        func_name += '_post'
-
-        other_set = {}
-        other_set["who"] = flask.request.form.get('email', '')
-        other_set["title"] = flask.request.form.get('title', '')
-        other_set["data"] = flask.request.form.get('data', '')
-
-        return await python_to_golang(func_name, other_set)
-    else:
-        return {}
-
-async def api_func_email_exter():
-    return flask.jsonify(await api_func_email())

+ 0 - 23
route/go_api_func_ip.py

@@ -1,23 +0,0 @@
-from .tool.func import *
-
-async def api_func_ip(data = 'Test'):
-    other_set = {}
-
-    func_name = sys._getframe().f_code.co_name
-    if flask.request.method == 'POST':
-        func_name += '_post'
-
-        for_a = 1
-        while 1:
-            data = flask.request.form.get('data_' + str(for_a), '')
-            
-            if data == '':
-                break
-            else:
-                other_set['data_' + str(for_a)] = data
-
-            for_a += 1
-    else:
-        other_set["data"] = data
-
-    return flask.jsonify(await python_to_golang(func_name, other_set))

+ 0 - 8
route/go_api_func_ip_menu.py

@@ -1,8 +0,0 @@
-from .tool.func import *
-
-async def api_func_ip_menu(ip = "Test", option = ""):
-    other_set = {}
-    other_set["ip"] = ip
-    other_set["option"] = option
-
-    return flask.jsonify(await python_to_golang(sys._getframe().f_code.co_name, other_set))

+ 0 - 16
route/go_api_func_language.py

@@ -1,16 +0,0 @@
-from .tool.func import *
-
-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', '')
-    else:
-        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)
-
-async def api_func_language_exter(legacy = 'on', data = 'Test'):
-    return flask.jsonify(await api_func_language(legacy, data))

+ 0 - 7
route/go_api_list_acl.py

@@ -1,7 +0,0 @@
-from .tool.func import *
-
-async def api_list_acl(data_type = ''):
-    other_set = {}
-    other_set = data_type
-
-    return flask.jsonify(await python_to_golang(sys._getframe().f_code.co_name, other_set))

+ 0 - 12
route/go_api_list_recent_edit_request.py

@@ -1,12 +0,0 @@
-from .tool.func import *
-
-async def api_list_recent_edit_request(num = 1, set_type = 'normal', limit = 50):
-    other_set = {}
-    other_set["num"] = str(num)
-    other_set["limit"] = str(limit)
-    other_set["set_type"] = set_type
-
-    return await python_to_golang(sys._getframe().f_code.co_name, other_set)
-
-async def api_list_recent_edit_request_exter(num = 1, set_type = 'normal', limit = 50):
-    return flask.jsonify(await api_list_recent_edit_request_exter(num, set_type, limit))

+ 4 - 7
route/main_setting_404_page.py

@@ -1,6 +1,5 @@
 from .tool.func import *
 
-from .go_api_func_language import api_func_language
 from .go_api_setting import api_setting
 
 async def main_setting_404_page():
@@ -19,15 +18,13 @@ async def main_setting_404_page():
 
             return redirect(conn, '/setting/404_page')
         else:
-            lang = await api_func_language('', 'enter_html save 404_file 404_page preview')
-
             set_type = await api_setting('manage_404_page')
             set_data = await api_setting('manage_404_page_content')
 
             data_html = ''
             select_list = [
-                ['404_page', lang['data']['404_page']],
-                ['404_file', lang['data']['404_file']]
+                ['404_page', await get_lang('404_page')],
+                ['404_file', await get_lang('404_file')]
             ]
 
             data_html += '<span class="__ON_SELECT_DIV__"><select class="__ON_SELECT__" name="select">'
@@ -47,9 +44,9 @@ async def main_setting_404_page():
 
             data_html += (
                 '<form method="post">' +
-                    '<textarea class="opennamu_textarea_500 __ON_TEXTAREA__" name="data" placeholder="' + lang['data']['enter_html'] + '">' + html.escape(form_data) + '</textarea>' +
+                    '<textarea class="opennamu_textarea_500 __ON_TEXTAREA__" name="data" placeholder="' + await get_lang('enter_html') + '">' + html.escape(form_data) + '</textarea>' +
                     '<hr class="main_hr">' +
-                    '<button class="__ON_BUTTON__" id="opennamu_save_button" type="submit">' + lang['data']['save'] + '</button>' +
+                    '<button class="__ON_BUTTON__" id="opennamu_save_button" type="submit">' + await get_lang('save') + '</button>' +
                 '</form>'
             )
 

+ 1 - 3
route/main_setting_email_test.py

@@ -1,14 +1,12 @@
 from .tool.func import *
 
-from .go_api_func_email import api_func_email
-
 async def main_setting_email_test():
     with get_db_connect() as conn:
         if await acl_check('', 'owner_auth', '', '') == 1:
             return await re_error(conn, 0)
         
         if flask.request.method == 'POST':
-            render_data = await api_func_email()
+            render_data = await python_to_golang("api_func_email", other_set = {})
             if render_data["response"] == "ok":
                 data = await get_lang("ok")
             else:

+ 6 - 3
route/recent_edit_request.py

@@ -2,8 +2,6 @@ from .tool.func import *
 
 from .recent_change import recent_change_send_render
 
-from .go_api_list_recent_edit_request import api_list_recent_edit_request
-
 async def recent_edit_request():
     with get_db_connect() as conn:
         div = ''
@@ -17,7 +15,12 @@ async def recent_edit_request():
                     </tr>
         '''
 
-        all_list = await api_list_recent_edit_request()
+        other_set = {}
+        other_set["num"] = "1"
+        other_set["limit"] = "50"
+        other_set["set_type"] = "normal"
+
+        all_list = await python_to_golang("api_list_recent_edit_request", other_set)
         for data in all_list:
             if re.search(r"\+", data[5]):
                 leng = '<span style="color:green;">(' + data[5] + ')</span>'

+ 35 - 37
views/main_css/js/func/func.js

@@ -128,50 +128,48 @@ function opennamu_do_ip_click(obj) {
     if (obj.id === "") {
         let user_name = obj.name;
 
-        fetch('/api/v2/ip_menu/' + user_name)
-            .then(response => {
-                if (!response.ok) {
-                    throw new Error(`API 호출 실패: ${response.status}`);
-                }
-                return response.json();
-            })
-            .then(data => {
-                data = data["data"];
-
-                let data_html = '';
-                for (let key in data) {
-                    for (let for_a = 0; for_a < data[key].length; for_a++) {
-                        data_html += '<a href="' + data[key][for_a][0] + '">' + data[key][for_a][1] + '</a> | ';
-                    }
+        fetch('/api/v2/ip_menu/' + user_name).then(response => {
+            if(!response.ok) {
+                throw new Error(`API 호출 실패: ${response.status}`);
+            }
+
+            return response.json();
+        }).then(data => {
+            data = data["data"];
+
+            let data_html = '';
+            for(let key in data) {
+                for(let for_a = 0; for_a < data[key].length; for_a++) {
+                    data_html += '<a href="' + data[key][for_a][0] + '">' + data[key][for_a][1] + '</a> | ';
                 }
+            }
 
-                data_html = data_html.replace(/ \| $/g, '');
-
-                let for_a;
-                for (for_a = 0; document.getElementById("opennamu_ip_render_" + String(for_a) + "_load"); for_a++) {}
+            data_html = data_html.replace(/ \| $/g, '');
 
-                let popup_html = '<span class="opennamu_popup_footnote" id="opennamu_ip_render_' + String(for_a) + '_load" style="display: none;"></span>';
-                popup_html += '<span style="display: none;" id="opennamu_ip_tool_' + String(for_a) + '">';
-                popup_html += data_html;
-                popup_html += '</span>';
+            let for_a;
+            for(for_a = 0; document.getElementById("opennamu_ip_render_" + String(for_a) + "_load"); for_a++) {}
 
-                obj.innerHTML += popup_html;
-                obj.id = 'opennamu_ip_render_' + String(for_a);
-                obj.onclick = '';
+            let popup_html = '<span class="opennamu_popup_footnote" id="opennamu_ip_render_' + String(for_a) + '_load" style="display: none;"></span>';
+            popup_html += '<span style="display: none;" id="opennamu_ip_tool_' + String(for_a) + '">';
+            popup_html += data_html;
+            popup_html += '</span>';
 
-                document.getElementById('opennamu_ip_render_' + String(for_a)).addEventListener("click", function () {
-                    opennamu_do_footnote_popover('opennamu_ip_render_' + String(for_a), '', 'opennamu_ip_tool_' + String(for_a), 'open');
-                });
-                document.addEventListener("click", function () {
-                    opennamu_do_footnote_popover('opennamu_ip_render_' + String(for_a), '', 'opennamu_ip_tool_' + String(for_a), 'close');
-                });
+            obj.innerHTML += popup_html;
+            obj.id = 'opennamu_ip_render_' + String(for_a);
+            obj.onclick = '';
 
-                obj.click();
-            })
-            .catch(err => {
-                console.error('IP 메뉴 호출 중 오류 발생:', err);
-                obj.innerHTML = 'IP 정보를 불러오는 데 실패했습니다.';
+            document.getElementById('opennamu_ip_render_' + String(for_a)).addEventListener("click", function () {
+                opennamu_do_footnote_popover('opennamu_ip_render_' + String(for_a), '', 'opennamu_ip_tool_' + String(for_a), 'open');
             });
+            document.addEventListener("click", function () {
+                opennamu_do_footnote_popover('opennamu_ip_render_' + String(for_a), '', 'opennamu_ip_tool_' + String(for_a), 'close');
+            });
+
+            obj.click();
+        }).catch(err => {
+            console.error('IP 메뉴 호출 중 오류 발생:', err);
+            obj.innerHTML = 'IP 정보를 불러오는 데 실패했습니다.';
+        });
     }
 }