diff --git a/mods/art/CONNECT1.ANS b/art/general/CONNECT1.ANS similarity index 100% rename from mods/art/CONNECT1.ANS rename to art/general/CONNECT1.ANS diff --git a/mods/art/DOORMANY.ANS b/art/general/DOORMANY.ANS similarity index 100% rename from mods/art/DOORMANY.ANS rename to art/general/DOORMANY.ANS diff --git a/mods/art/GNSPMPT.ANS b/art/general/GNSPMPT.ANS similarity index 100% rename from mods/art/GNSPMPT.ANS rename to art/general/GNSPMPT.ANS diff --git a/mods/art/LOGPMPT.ANS b/art/general/LOGPMPT.ANS similarity index 100% rename from mods/art/LOGPMPT.ANS rename to art/general/LOGPMPT.ANS diff --git a/mods/art/NEWSCAN.ANS b/art/general/NEWSCAN.ANS similarity index 100% rename from mods/art/NEWSCAN.ANS rename to art/general/NEWSCAN.ANS diff --git a/mods/art/NEWUSER1.ANS b/art/general/NEWUSER1.ANS similarity index 100% rename from mods/art/NEWUSER1.ANS rename to art/general/NEWUSER1.ANS diff --git a/mods/art/ONEADD.ANS b/art/general/ONEADD.ANS similarity index 100% rename from mods/art/ONEADD.ANS rename to art/general/ONEADD.ANS diff --git a/mods/art/ONELINER.ANS b/art/general/ONELINER.ANS similarity index 100% rename from mods/art/ONELINER.ANS rename to art/general/ONELINER.ANS diff --git a/mods/art/PRELOGAD.ANS b/art/general/PRELOGAD.ANS similarity index 100% rename from mods/art/PRELOGAD.ANS rename to art/general/PRELOGAD.ANS diff --git a/mods/art/WELCOME1.ANS b/art/general/WELCOME1.ANS similarity index 100% rename from mods/art/WELCOME1.ANS rename to art/general/WELCOME1.ANS diff --git a/mods/art/WELCOME2.ANS b/art/general/WELCOME2.ANS similarity index 100% rename from mods/art/WELCOME2.ANS rename to art/general/WELCOME2.ANS diff --git a/mods/art/demo_edit_text_view.ans b/art/general/demo_edit_text_view.ans similarity index 100% rename from mods/art/demo_edit_text_view.ans rename to art/general/demo_edit_text_view.ans diff --git a/mods/art/demo_edit_text_view1.ans b/art/general/demo_edit_text_view1.ans similarity index 100% rename from mods/art/demo_edit_text_view1.ans rename to art/general/demo_edit_text_view1.ans diff --git a/mods/art/demo_fse_local_user.ans b/art/general/demo_fse_local_user.ans similarity index 100% rename from mods/art/demo_fse_local_user.ans rename to art/general/demo_fse_local_user.ans diff --git a/mods/art/demo_fse_netmail_body.ans b/art/general/demo_fse_netmail_body.ans similarity index 100% rename from mods/art/demo_fse_netmail_body.ans rename to art/general/demo_fse_netmail_body.ans diff --git a/mods/art/demo_fse_netmail_footer_edit.ans b/art/general/demo_fse_netmail_footer_edit.ans similarity index 100% rename from mods/art/demo_fse_netmail_footer_edit.ans rename to art/general/demo_fse_netmail_footer_edit.ans diff --git a/mods/art/demo_fse_netmail_footer_edit_menu.ans b/art/general/demo_fse_netmail_footer_edit_menu.ans similarity index 100% rename from mods/art/demo_fse_netmail_footer_edit_menu.ans rename to art/general/demo_fse_netmail_footer_edit_menu.ans diff --git a/mods/art/demo_fse_netmail_header.ans b/art/general/demo_fse_netmail_header.ans similarity index 100% rename from mods/art/demo_fse_netmail_header.ans rename to art/general/demo_fse_netmail_header.ans diff --git a/mods/art/demo_fse_netmail_help.ans b/art/general/demo_fse_netmail_help.ans similarity index 100% rename from mods/art/demo_fse_netmail_help.ans rename to art/general/demo_fse_netmail_help.ans diff --git a/mods/art/demo_horizontal_menu_view1.ans b/art/general/demo_horizontal_menu_view1.ans similarity index 100% rename from mods/art/demo_horizontal_menu_view1.ans rename to art/general/demo_horizontal_menu_view1.ans diff --git a/mods/art/demo_mask_edit_text_view1.ans b/art/general/demo_mask_edit_text_view1.ans similarity index 100% rename from mods/art/demo_mask_edit_text_view1.ans rename to art/general/demo_mask_edit_text_view1.ans diff --git a/mods/art/demo_multi_line_edit_text_view1.ans b/art/general/demo_multi_line_edit_text_view1.ans similarity index 100% rename from mods/art/demo_multi_line_edit_text_view1.ans rename to art/general/demo_multi_line_edit_text_view1.ans diff --git a/mods/art/demo_selection_vm.ans b/art/general/demo_selection_vm.ans similarity index 100% rename from mods/art/demo_selection_vm.ans rename to art/general/demo_selection_vm.ans diff --git a/mods/art/demo_spin_and_toggle.ans b/art/general/demo_spin_and_toggle.ans similarity index 100% rename from mods/art/demo_spin_and_toggle.ans rename to art/general/demo_spin_and_toggle.ans diff --git a/mods/art/demo_vertical_menu_view1.ans b/art/general/demo_vertical_menu_view1.ans similarity index 100% rename from mods/art/demo_vertical_menu_view1.ans rename to art/general/demo_vertical_menu_view1.ans diff --git a/mods/art/erc.ans b/art/general/erc.ans similarity index 100% rename from mods/art/erc.ans rename to art/general/erc.ans diff --git a/mods/art/menu_prompt.ans b/art/general/menu_prompt.ans similarity index 100% rename from mods/art/menu_prompt.ans rename to art/general/menu_prompt.ans diff --git a/mods/art/msg_area_footer_view.ans b/art/general/msg_area_footer_view.ans similarity index 100% rename from mods/art/msg_area_footer_view.ans rename to art/general/msg_area_footer_view.ans diff --git a/mods/art/msg_area_list.ans b/art/general/msg_area_list.ans similarity index 100% rename from mods/art/msg_area_list.ans rename to art/general/msg_area_list.ans diff --git a/mods/art/msg_area_post_header.ans b/art/general/msg_area_post_header.ans similarity index 100% rename from mods/art/msg_area_post_header.ans rename to art/general/msg_area_post_header.ans diff --git a/mods/art/msg_area_view_header.ans b/art/general/msg_area_view_header.ans similarity index 100% rename from mods/art/msg_area_view_header.ans rename to art/general/msg_area_view_header.ans diff --git a/mods/art/test.ans b/art/general/test.ans similarity index 100% rename from mods/art/test.ans rename to art/general/test.ans diff --git a/mods/themes/luciano_blocktronics/BBSADD.ANS b/art/themes/luciano_blocktronics/BBSADD.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/BBSADD.ANS rename to art/themes/luciano_blocktronics/BBSADD.ANS diff --git a/mods/themes/luciano_blocktronics/BBSLIST.ANS b/art/themes/luciano_blocktronics/BBSLIST.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/BBSLIST.ANS rename to art/themes/luciano_blocktronics/BBSLIST.ANS diff --git a/mods/themes/luciano_blocktronics/CCHANGE.ANS b/art/themes/luciano_blocktronics/CCHANGE.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/CCHANGE.ANS rename to art/themes/luciano_blocktronics/CCHANGE.ANS diff --git a/mods/themes/luciano_blocktronics/CHANGE.ANS b/art/themes/luciano_blocktronics/CHANGE.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/CHANGE.ANS rename to art/themes/luciano_blocktronics/CHANGE.ANS diff --git a/mods/themes/luciano_blocktronics/CONFSCR.ANS b/art/themes/luciano_blocktronics/CONFSCR.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/CONFSCR.ANS rename to art/themes/luciano_blocktronics/CONFSCR.ANS diff --git a/mods/themes/luciano_blocktronics/DONE.ANS b/art/themes/luciano_blocktronics/DONE.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/DONE.ANS rename to art/themes/luciano_blocktronics/DONE.ANS diff --git a/mods/themes/luciano_blocktronics/DOORMNU.ANS b/art/themes/luciano_blocktronics/DOORMNU.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/DOORMNU.ANS rename to art/themes/luciano_blocktronics/DOORMNU.ANS diff --git a/mods/themes/luciano_blocktronics/FAREASEL.ANS b/art/themes/luciano_blocktronics/FAREASEL.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FAREASEL.ANS rename to art/themes/luciano_blocktronics/FAREASEL.ANS diff --git a/mods/themes/luciano_blocktronics/FBHELP.ANS b/art/themes/luciano_blocktronics/FBHELP.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FBHELP.ANS rename to art/themes/luciano_blocktronics/FBHELP.ANS diff --git a/mods/themes/luciano_blocktronics/FBNORES.ANS b/art/themes/luciano_blocktronics/FBNORES.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FBNORES.ANS rename to art/themes/luciano_blocktronics/FBNORES.ANS diff --git a/mods/themes/luciano_blocktronics/FBRWSE.ANS b/art/themes/luciano_blocktronics/FBRWSE.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FBRWSE.ANS rename to art/themes/luciano_blocktronics/FBRWSE.ANS diff --git a/mods/themes/luciano_blocktronics/FDETAIL.ANS b/art/themes/luciano_blocktronics/FDETAIL.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FDETAIL.ANS rename to art/themes/luciano_blocktronics/FDETAIL.ANS diff --git a/mods/themes/luciano_blocktronics/FDETGEN.ANS b/art/themes/luciano_blocktronics/FDETGEN.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FDETGEN.ANS rename to art/themes/luciano_blocktronics/FDETGEN.ANS diff --git a/mods/themes/luciano_blocktronics/FDETLST.ANS b/art/themes/luciano_blocktronics/FDETLST.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FDETLST.ANS rename to art/themes/luciano_blocktronics/FDETLST.ANS diff --git a/mods/themes/luciano_blocktronics/FDETNFO.ANS b/art/themes/luciano_blocktronics/FDETNFO.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FDETNFO.ANS rename to art/themes/luciano_blocktronics/FDETNFO.ANS diff --git a/mods/themes/luciano_blocktronics/FDLMGR.ANS b/art/themes/luciano_blocktronics/FDLMGR.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FDLMGR.ANS rename to art/themes/luciano_blocktronics/FDLMGR.ANS diff --git a/mods/themes/luciano_blocktronics/FEMPTYQ.ANS b/art/themes/luciano_blocktronics/FEMPTYQ.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FEMPTYQ.ANS rename to art/themes/luciano_blocktronics/FEMPTYQ.ANS diff --git a/mods/themes/luciano_blocktronics/FFILEDT.ANS b/art/themes/luciano_blocktronics/FFILEDT.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FFILEDT.ANS rename to art/themes/luciano_blocktronics/FFILEDT.ANS diff --git a/mods/themes/luciano_blocktronics/FILPMPT.ANS b/art/themes/luciano_blocktronics/FILPMPT.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FILPMPT.ANS rename to art/themes/luciano_blocktronics/FILPMPT.ANS diff --git a/mods/themes/luciano_blocktronics/FMENU.ANS b/art/themes/luciano_blocktronics/FMENU.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FMENU.ANS rename to art/themes/luciano_blocktronics/FMENU.ANS diff --git a/mods/themes/luciano_blocktronics/FNEWBRWSE.ANS b/art/themes/luciano_blocktronics/FNEWBRWSE.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FNEWBRWSE.ANS rename to art/themes/luciano_blocktronics/FNEWBRWSE.ANS diff --git a/mods/themes/luciano_blocktronics/FORGOTPW.ANS b/art/themes/luciano_blocktronics/FORGOTPW.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FORGOTPW.ANS rename to art/themes/luciano_blocktronics/FORGOTPW.ANS diff --git a/mods/themes/luciano_blocktronics/FORGOTPWSENT.ANS b/art/themes/luciano_blocktronics/FORGOTPWSENT.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FORGOTPWSENT.ANS rename to art/themes/luciano_blocktronics/FORGOTPWSENT.ANS diff --git a/mods/themes/luciano_blocktronics/FPROSEL.ANS b/art/themes/luciano_blocktronics/FPROSEL.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FPROSEL.ANS rename to art/themes/luciano_blocktronics/FPROSEL.ANS diff --git a/mods/themes/luciano_blocktronics/FSEARCH.ANS b/art/themes/luciano_blocktronics/FSEARCH.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/FSEARCH.ANS rename to art/themes/luciano_blocktronics/FSEARCH.ANS diff --git a/mods/themes/luciano_blocktronics/IDLELOG.ANS b/art/themes/luciano_blocktronics/IDLELOG.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/IDLELOG.ANS rename to art/themes/luciano_blocktronics/IDLELOG.ANS diff --git a/mods/themes/luciano_blocktronics/LASTCALL.ANS b/art/themes/luciano_blocktronics/LASTCALL.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/LASTCALL.ANS rename to art/themes/luciano_blocktronics/LASTCALL.ANS diff --git a/mods/themes/luciano_blocktronics/LETTER.ANS b/art/themes/luciano_blocktronics/LETTER.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/LETTER.ANS rename to art/themes/luciano_blocktronics/LETTER.ANS diff --git a/mods/themes/luciano_blocktronics/MAILMNU.ANS b/art/themes/luciano_blocktronics/MAILMNU.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MAILMNU.ANS rename to art/themes/luciano_blocktronics/MAILMNU.ANS diff --git a/mods/themes/luciano_blocktronics/MATRIX.ANS b/art/themes/luciano_blocktronics/MATRIX.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MATRIX.ANS rename to art/themes/luciano_blocktronics/MATRIX.ANS diff --git a/mods/themes/luciano_blocktronics/MMENU.ANS b/art/themes/luciano_blocktronics/MMENU.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MMENU.ANS rename to art/themes/luciano_blocktronics/MMENU.ANS diff --git a/mods/themes/luciano_blocktronics/MNUPRMT.ANS b/art/themes/luciano_blocktronics/MNUPRMT.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MNUPRMT.ANS rename to art/themes/luciano_blocktronics/MNUPRMT.ANS diff --git a/mods/themes/luciano_blocktronics/MSGBODY.ANS b/art/themes/luciano_blocktronics/MSGBODY.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGBODY.ANS rename to art/themes/luciano_blocktronics/MSGBODY.ANS diff --git a/mods/themes/luciano_blocktronics/MSGEFTR.ANS b/art/themes/luciano_blocktronics/MSGEFTR.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGEFTR.ANS rename to art/themes/luciano_blocktronics/MSGEFTR.ANS diff --git a/mods/themes/luciano_blocktronics/MSGEHDR.ANS b/art/themes/luciano_blocktronics/MSGEHDR.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGEHDR.ANS rename to art/themes/luciano_blocktronics/MSGEHDR.ANS diff --git a/mods/themes/luciano_blocktronics/MSGEHLP.ANS b/art/themes/luciano_blocktronics/MSGEHLP.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGEHLP.ANS rename to art/themes/luciano_blocktronics/MSGEHLP.ANS diff --git a/mods/themes/luciano_blocktronics/MSGEMFT.ANS b/art/themes/luciano_blocktronics/MSGEMFT.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGEMFT.ANS rename to art/themes/luciano_blocktronics/MSGEMFT.ANS diff --git a/mods/themes/luciano_blocktronics/MSGLIST.ANS b/art/themes/luciano_blocktronics/MSGLIST.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGLIST.ANS rename to art/themes/luciano_blocktronics/MSGLIST.ANS diff --git a/mods/themes/luciano_blocktronics/MSGMNU.ANS b/art/themes/luciano_blocktronics/MSGMNU.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGMNU.ANS rename to art/themes/luciano_blocktronics/MSGMNU.ANS diff --git a/mods/themes/luciano_blocktronics/MSGPMPT.ANS b/art/themes/luciano_blocktronics/MSGPMPT.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGPMPT.ANS rename to art/themes/luciano_blocktronics/MSGPMPT.ANS diff --git a/mods/themes/luciano_blocktronics/MSGQUOT.ANS b/art/themes/luciano_blocktronics/MSGQUOT.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGQUOT.ANS rename to art/themes/luciano_blocktronics/MSGQUOT.ANS diff --git a/mods/themes/luciano_blocktronics/MSGVFTR.ANS b/art/themes/luciano_blocktronics/MSGVFTR.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGVFTR.ANS rename to art/themes/luciano_blocktronics/MSGVFTR.ANS diff --git a/mods/themes/luciano_blocktronics/MSGVHDR.ANS b/art/themes/luciano_blocktronics/MSGVHDR.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGVHDR.ANS rename to art/themes/luciano_blocktronics/MSGVHDR.ANS diff --git a/mods/themes/luciano_blocktronics/MSGVHLP.ANS b/art/themes/luciano_blocktronics/MSGVHLP.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/MSGVHLP.ANS rename to art/themes/luciano_blocktronics/MSGVHLP.ANS diff --git a/mods/themes/luciano_blocktronics/NEWMSGS.ANS b/art/themes/luciano_blocktronics/NEWMSGS.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/NEWMSGS.ANS rename to art/themes/luciano_blocktronics/NEWMSGS.ANS diff --git a/mods/themes/luciano_blocktronics/NUA.ANS b/art/themes/luciano_blocktronics/NUA.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/NUA.ANS rename to art/themes/luciano_blocktronics/NUA.ANS diff --git a/mods/themes/luciano_blocktronics/ONEADD.ANS b/art/themes/luciano_blocktronics/ONEADD.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/ONEADD.ANS rename to art/themes/luciano_blocktronics/ONEADD.ANS diff --git a/mods/themes/luciano_blocktronics/ONELINER.ANS b/art/themes/luciano_blocktronics/ONELINER.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/ONELINER.ANS rename to art/themes/luciano_blocktronics/ONELINER.ANS diff --git a/mods/themes/luciano_blocktronics/PAUSE.ANS b/art/themes/luciano_blocktronics/PAUSE.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/PAUSE.ANS rename to art/themes/luciano_blocktronics/PAUSE.ANS diff --git a/mods/themes/luciano_blocktronics/RATEFILE.ANS b/art/themes/luciano_blocktronics/RATEFILE.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/RATEFILE.ANS rename to art/themes/luciano_blocktronics/RATEFILE.ANS diff --git a/mods/themes/luciano_blocktronics/RUMORADD.ANS b/art/themes/luciano_blocktronics/RUMORADD.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/RUMORADD.ANS rename to art/themes/luciano_blocktronics/RUMORADD.ANS diff --git a/mods/themes/luciano_blocktronics/RUMORS.ANS b/art/themes/luciano_blocktronics/RUMORS.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/RUMORS.ANS rename to art/themes/luciano_blocktronics/RUMORS.ANS diff --git a/mods/themes/luciano_blocktronics/STATUS.ANS b/art/themes/luciano_blocktronics/STATUS.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/STATUS.ANS rename to art/themes/luciano_blocktronics/STATUS.ANS diff --git a/mods/themes/luciano_blocktronics/SYSSTAT.ANS b/art/themes/luciano_blocktronics/SYSSTAT.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/SYSSTAT.ANS rename to art/themes/luciano_blocktronics/SYSSTAT.ANS diff --git a/mods/themes/luciano_blocktronics/TBRIDGE.ANS b/art/themes/luciano_blocktronics/TBRIDGE.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/TBRIDGE.ANS rename to art/themes/luciano_blocktronics/TBRIDGE.ANS diff --git a/mods/themes/luciano_blocktronics/TOONODE.ANS b/art/themes/luciano_blocktronics/TOONODE.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/TOONODE.ANS rename to art/themes/luciano_blocktronics/TOONODE.ANS diff --git a/mods/themes/luciano_blocktronics/ULCHECK.ANS b/art/themes/luciano_blocktronics/ULCHECK.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/ULCHECK.ANS rename to art/themes/luciano_blocktronics/ULCHECK.ANS diff --git a/mods/themes/luciano_blocktronics/ULDETAIL.ANS b/art/themes/luciano_blocktronics/ULDETAIL.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/ULDETAIL.ANS rename to art/themes/luciano_blocktronics/ULDETAIL.ANS diff --git a/mods/themes/luciano_blocktronics/ULDUPES.ANS b/art/themes/luciano_blocktronics/ULDUPES.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/ULDUPES.ANS rename to art/themes/luciano_blocktronics/ULDUPES.ANS diff --git a/mods/themes/luciano_blocktronics/ULNOAREA.ANS b/art/themes/luciano_blocktronics/ULNOAREA.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/ULNOAREA.ANS rename to art/themes/luciano_blocktronics/ULNOAREA.ANS diff --git a/mods/themes/luciano_blocktronics/ULOPTS.ANS b/art/themes/luciano_blocktronics/ULOPTS.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/ULOPTS.ANS rename to art/themes/luciano_blocktronics/ULOPTS.ANS diff --git a/mods/themes/luciano_blocktronics/USERLOG.ANS b/art/themes/luciano_blocktronics/USERLOG.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/USERLOG.ANS rename to art/themes/luciano_blocktronics/USERLOG.ANS diff --git a/mods/themes/luciano_blocktronics/USERLST.ANS b/art/themes/luciano_blocktronics/USERLST.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/USERLST.ANS rename to art/themes/luciano_blocktronics/USERLST.ANS diff --git a/mods/themes/luciano_blocktronics/WHOSON.ANS b/art/themes/luciano_blocktronics/WHOSON.ANS similarity index 100% rename from mods/themes/luciano_blocktronics/WHOSON.ANS rename to art/themes/luciano_blocktronics/WHOSON.ANS diff --git a/mods/themes/luciano_blocktronics/theme.hjson b/art/themes/luciano_blocktronics/theme.hjson similarity index 100% rename from mods/themes/luciano_blocktronics/theme.hjson rename to art/themes/luciano_blocktronics/theme.hjson diff --git a/mods/menu.hjson b/config/menu.hjson similarity index 98% rename from mods/menu.hjson rename to config/menu.hjson index b445ec85..ce5e8a38 100644 --- a/mods/menu.hjson +++ b/config/menu.hjson @@ -220,7 +220,7 @@ } newUserApplication: { - module: nua + module: @systemModule:nua art: NUA options: { menuFlags: [ "noHistory" ] @@ -341,7 +341,7 @@ // Canceling this form logs off vs falling back to matrix // newUserApplicationSsh: { - module: nua + module: @systemModule:nua art: NUA fallback: logoff options: { @@ -445,7 +445,7 @@ newUserFeedbackToSysOp: { desc: Feedback to SysOp - module: msg_area_post_fse + module: @systemModule:msg_area_post_fse next: [ { acs: AS2 @@ -579,7 +579,7 @@ fullLoginSequenceLastCallers: { desc: Last Callers - module: last_callers + module: @systemModule:last_callers art: LASTCALL options: { pause: true @@ -589,7 +589,7 @@ } fullLoginSequenceWhosOnline: { desc: Who's Online - module: whos_online + module: @systemModule:whos_online art: WHOSON options: { pause: true } next: fullLoginSequenceOnelinerz @@ -597,7 +597,7 @@ fullLoginSequenceOnelinerz: { desc: Viewing Onelinerz - module: onelinerz + module: @systemModule:onelinerz next: [ { // calls >= 2 @@ -732,7 +732,7 @@ newScanMessageList: { desc: New Messages - module: msg_list + module: @systemModule:msg_list art: NEWMSGS config: { menuViewPost: messageAreaViewPost @@ -772,7 +772,7 @@ } newScanFileBaseList: { - module: file_area_list + module: @systemModule:file_area_list desc: New Files config: { art: { @@ -1019,14 +1019,14 @@ mainMenuLastCallers: { desc: Last Callers - module: last_callers + module: @systemModule:last_callers art: LASTCALL options: { pause: true } } mainMenuWhosOnline: { desc: Who's Online - module: whos_online + module: @systemModule:whos_online art: WHOSON options: { pause: true } } @@ -1045,7 +1045,7 @@ mainMenuUserList: { desc: User Listing - module: user_list + module: @systemModule:user_list art: USERLST form: { 0: { @@ -1166,7 +1166,7 @@ mainMenuFeedbackToSysOp: { desc: Feedback to SysOp - module: msg_area_post_fse + module: @systemModule:msg_area_post_fse config: { art: { header: MSGEHDR @@ -1286,7 +1286,7 @@ mainMenuOnelinerz: { desc: Viewing Onelinerz - module: onelinerz + module: @systemModule:onelinerz options: { cls: true } @@ -1372,7 +1372,7 @@ mainMenuRumorz: { desc: Rumorz - module: rumorz + module: @systemModule:rumorz options: { cls: true } @@ -1458,7 +1458,7 @@ ercClient: { art: erc - module: erc_client + module: @systemModule:erc_client config: { host: localhost port: 5001 @@ -1510,7 +1510,7 @@ bbsList: { desc: Viewing BBS List - module: bbs_list + module: @systemModule:bbs_list options: { cls: true } @@ -1661,7 +1661,7 @@ // doorPimpWars: { desc: Playing PimpWars - module: abracadabra + module: @systemModule:abracadabra config: { name: PimpWars dropFileType: DORINFO @@ -1684,7 +1684,7 @@ // doorTradeWars2002BBSLink: { desc: Playing TW 2002 (BBSLink) - module: bbs_link + module: @systemModule:bbs_link config: { sysCode: XXXXXXXX authCode: XXXXXXXX @@ -1716,7 +1716,7 @@ telnetBridgeAgency: { desc: Connected to HappyLand BBS - module: telnet_bridge + module: @systemModule:telnet_bridge config: { host: agency.bbs.geek.nz } @@ -1779,7 +1779,7 @@ messageAreaChangeCurrentConference: { art: CCHANGE - module: msg_conf_list + module: @systemModule:msg_conf_list form: { 0: { mci: { @@ -1810,7 +1810,7 @@ messageAreaChangeCurrentArea: { // :TODO: rename this art to ACHANGE art: CHANGE - module: msg_area_list + module: @systemModule:msg_area_list form: { 0: { mci: { @@ -1839,7 +1839,7 @@ } messageAreaMessageList: { - module: msg_list + module: @systemModule:msg_list art: MSGLIST config: { menuViewPost: messageAreaViewPost @@ -1875,7 +1875,7 @@ } messageAreaViewPost: { - module: msg_area_view_fse + module: @systemModule:msg_area_view_fse config: { art: { header: MSGVHDR @@ -1991,7 +1991,7 @@ } messageAreaReplyPost: { - module: msg_area_post_fse + module: @systemModule:msg_area_post_fse config: { art: { header: MSGEHDR @@ -2150,7 +2150,7 @@ // :TODO: messageAreaSelect (change msg areas -> call @systemMethod -> fallback to menu messageAreaNewPost: { desc: Posting message, - module: msg_area_post_fse + module: @systemModule:msg_area_post_fse config: { art: { header: MSGEHDR @@ -2306,7 +2306,7 @@ mailMenuCreateMessage: { desc: Mailing Someone - module: msg_area_post_fse + module: @systemModule:msg_area_post_fse config: { art: { header: MSGEHDR @@ -2423,7 +2423,7 @@ } mailMenuInbox: { - module: msg_list + module: @systemModule:msg_list art: MSGLIST config: { menuViewPost: messageAreaViewPost @@ -2501,7 +2501,7 @@ } fileBaseListEntries: { - module: file_area_list + module: @systemModule:file_area_list desc: Browsing Files config: { art: { @@ -2669,7 +2669,7 @@ fileBaseBrowseByAreaSelect: { desc: Browsing File Areas - module: file_base_area_select + module: @systemModule:file_base_area_select art: FAREASEL form: { 0: { @@ -2725,7 +2725,7 @@ } fileBaseSearch: { - module: file_base_search + module: @systemModule:file_base_search desc: Searching Files art: FSEARCH form: { @@ -2799,7 +2799,7 @@ fileAreaFilterEditor: { desc: File Filter Editor - module: file_area_filter_edit + module: @systemModule:file_area_filter_edit art: FFILEDT form: { 0: { @@ -2889,7 +2889,7 @@ fileBaseDownloadManager: { desc: Download Manager - module: file_base_download_manager + module: @systemModule:file_base_download_manager config: { art: { queueManager: FDLMGR @@ -2950,7 +2950,7 @@ fileBaseWebDownloadManager: { desc: Web D/L Manager - module: file_base_web_download_manager + module: @systemModule:file_base_web_download_manager config: { art: { queueManager: FWDLMGR @@ -3017,7 +3017,7 @@ fileTransferProtocolSelection: { desc: Protocol selection - module: file_transfer_protocol_select + module: @systemModule:file_transfer_protocol_select art: FPROSEL form: { 0: { @@ -3049,7 +3049,7 @@ fileBaseUploadFiles: { desc: Uploading - module: upload + module: @systemModule:upload config: { art: { options: ULOPTS diff --git a/mods/prompt.hjson b/config/prompt.hjson similarity index 100% rename from mods/prompt.hjson rename to config/prompt.hjson diff --git a/mods/abracadabra.js b/core/abracadabra.js similarity index 94% rename from mods/abracadabra.js rename to core/abracadabra.js index a84d2c63..85d1e205 100644 --- a/mods/abracadabra.js +++ b/core/abracadabra.js @@ -1,11 +1,11 @@ /* jslint node: true */ 'use strict'; -const MenuModule = require('../core/menu_module.js').MenuModule; -const DropFile = require('../core/dropfile.js').DropFile; -const door = require('../core/door.js'); -const theme = require('../core/theme.js'); -const ansi = require('../core/ansi_term.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const DropFile = require('./dropfile.js').DropFile; +const door = require('./door.js'); +const theme = require('./theme.js'); +const ansi = require('./ansi_term.js'); const async = require('async'); const assert = require('assert'); diff --git a/core/art.js b/core/art.js index 28657fc0..19e0bafe 100644 --- a/core/art.js +++ b/core/art.js @@ -14,7 +14,7 @@ const paths = require('path'); const assert = require('assert'); const iconv = require('iconv-lite'); const _ = require('lodash'); -const farmhash = require('farmhash'); +const xxhash = require('xxhash'); exports.getArt = getArt; exports.getArtFromPath = getArtFromPath; @@ -288,7 +288,7 @@ function display(client, art, options, cb) { } if(!options.disableMciCache) { - artHash = farmhash.hash32(art); + artHash = xxhash.hash(new Buffer(art), 0xCAFEBABE); // see if we have a mciMap cached for this art if(client.mciCache) { diff --git a/core/bbs.js b/core/bbs.js index 02058bce..43bf7cf3 100644 --- a/core/bbs.js +++ b/core/bbs.js @@ -29,11 +29,12 @@ const ENIGMA_COPYRIGHT = 'ENiGMA½ Copyright (c) 2014-2017 Bryan Ashby'; const HELP = `${ENIGMA_COPYRIGHT} usage: main.js +eg : main.js --config /enigma_install_path/config/ valid args: --version : display version --help : displays this help - --config PATH : override default config.hjson path + --config PATH : override default config path `; function printHelpAndExit() { @@ -56,7 +57,8 @@ function main() { return callback(null, configOverridePath || conf.getDefaultPath(), _.isString(configOverridePath)); }, function initConfig(configPath, configPathSupplied, callback) { - conf.init(resolvePath(configPath), function configInit(err) { + const configFile = configPath + 'config.hjson'; + conf.init(resolvePath(configFile), function configInit(err) { // // If the user supplied a path and we can't read/parse it @@ -65,7 +67,7 @@ function main() { if(err) { if('ENOENT' === err.code) { if(configPathSupplied) { - console.error('Configuration file does not exist: ' + configPath); + console.error('Configuration file does not exist: ' + configFile); } else { configPathSupplied = null; // make non-fatal; we'll go with defaults } diff --git a/mods/bbs_link.js b/core/bbs_link.js similarity index 97% rename from mods/bbs_link.js rename to core/bbs_link.js index 0cf0a5db..be341115 100644 --- a/mods/bbs_link.js +++ b/core/bbs_link.js @@ -1,8 +1,8 @@ /* jslint node: true */ 'use strict'; -const MenuModule = require('../core/menu_module.js').MenuModule; -const resetScreen = require('../core/ansi_term.js').resetScreen; +const MenuModule = require('./menu_module.js').MenuModule; +const resetScreen = require('./ansi_term.js').resetScreen; const async = require('async'); const _ = require('lodash'); diff --git a/mods/bbs_list.js b/core/bbs_list.js similarity index 96% rename from mods/bbs_list.js rename to core/bbs_list.js index ec964a36..33a7ff59 100644 --- a/mods/bbs_list.js +++ b/core/bbs_list.js @@ -2,18 +2,18 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; +const MenuModule = require('./menu_module.js').MenuModule; const { getModDatabasePath, getTransactionDatabase -} = require('../core/database.js'); +} = require('./database.js'); -const ViewController = require('../core/view_controller.js').ViewController; -const ansi = require('../core/ansi_term.js'); -const theme = require('../core/theme.js'); -const User = require('../core/user.js'); -const stringFormat = require('../core/string_format.js'); +const ViewController = require('./view_controller.js').ViewController; +const ansi = require('./ansi_term.js'); +const theme = require('./theme.js'); +const User = require('./user.js'); +const stringFormat = require('./string_format.js'); // deps const async = require('async'); diff --git a/core/config.js b/core/config.js index 367143b6..73f0fa28 100644 --- a/core/config.js +++ b/core/config.js @@ -111,11 +111,8 @@ function init(configPath, options, cb) { } function getDefaultPath() { - const base = miscUtil.resolvePath('~/'); - if(base) { - // e.g. /home/users/joeuser/.config/enigma-bbs/config.hjson - return paths.join(base, '.config', 'enigma-bbs', 'config.hjson'); - } + // e.g. /enigma-bbs-install-path/config/ + return './config/'; } function getDefaultConfig() { @@ -127,8 +124,8 @@ function getDefaultConfig() { loginAttempts : 3, - menuFile : 'menu.hjson', // Override to use something else, e.g. demo.hjson. Can be a full path (defaults to ./mods) - promptFile : 'prompt.hjson', // Override to use soemthing else, e.g. myprompt.hjson. Can be a full path (defaults to ./mods) + menuFile : 'menu.hjson', // Override to use something else, e.g. demo.hjson. Can be a full path (defaults to ./config) + promptFile : 'prompt.hjson', // Override to use soemthing else, e.g. myprompt.hjson. Can be a full path (defaults to ./config) }, // :TODO: see notes below about 'theme' section - move this! @@ -193,6 +190,7 @@ function getDefaultConfig() { }, paths : { + config : paths.join(__dirname, './../config/'), mods : paths.join(__dirname, './../mods/'), loginServers : paths.join(__dirname, './servers/login/'), contentServers : paths.join(__dirname, './servers/content/'), @@ -200,8 +198,8 @@ function getDefaultConfig() { scannerTossers : paths.join(__dirname, './scanner_tossers/'), mailers : paths.join(__dirname, './mailers/') , - art : paths.join(__dirname, './../mods/art/'), - themes : paths.join(__dirname, './../mods/themes/'), + art : paths.join(__dirname, './../art/general/'), + themes : paths.join(__dirname, './../art/themes/'), logs : paths.join(__dirname, './../logs/'), // :TODO: set up based on system, e.g. /var/logs/enigmabbs or such db : paths.join(__dirname, './../db/'), modsDb : paths.join(__dirname, './../db/mods/'), @@ -217,18 +215,18 @@ function getDefaultConfig() { }, ssh : { port : 8889, - enabled : false, // defualt to false as PK/pass in config.hjson are required + enabled : false, // default to false as PK/pass in config.hjson are required // // Private key in PEM format // // Generating your PK: - // > openssl genrsa -des3 -out ./misc/ssh_private_key.pem 2048 + // > openssl genrsa -des3 -out ./config/ssh_private_key.pem 2048 // // Then, set servers.ssh.privateKeyPass to the password you use above // in your config.hjson // - privateKeyPem : paths.join(__dirname, './../misc/ssh_private_key.pem'), + privateKeyPem : paths.join(__dirname, './../config/ssh_private_key.pem'), firstMenu : 'sshConnected', firstMenuNewUser : 'sshConnectedNewUser', }, @@ -236,8 +234,8 @@ function getDefaultConfig() { port : 8810, // ws:// enabled : false, securePort : 8811, // wss:// - must provide certPem and keyPem - certPem : paths.join(__dirname, './../misc/https_cert.pem'), - keyPem : paths.join(__dirname, './../misc/https_cert_key.pem'), + certPem : paths.join(__dirname, './../config/https_cert.pem'), + keyPem : paths.join(__dirname, './../config/https_cert_key.pem'), }, }, @@ -273,8 +271,8 @@ function getDefaultConfig() { https : { enabled : false, port : 8443, - certPem : paths.join(__dirname, './../misc/https_cert.pem'), - keyPem : paths.join(__dirname, './../misc/https_cert_key.pem'), + certPem : paths.join(__dirname, './../config/https_cert.pem'), + keyPem : paths.join(__dirname, './../config/https_cert_key.pem'), } } }, diff --git a/core/config_util.js b/core/config_util.js index f078f758..40723d9a 100644 --- a/core/config_util.js +++ b/core/config_util.js @@ -1,16 +1,15 @@ /* jslint node: true */ 'use strict'; - -var configCache = require('./config_cache.js'); - -var paths = require('path'); +const Config = require('./config.js').config; +const configCache = require('./config_cache.js'); +const paths = require('path'); exports.getFullConfig = getFullConfig; function getFullConfig(filePath, cb) { - // |filePath| is assumed to be in 'mods' if it's only a file name + // |filePath| is assumed to be in the config path if it's only a file name if('.' === paths.dirname(filePath)) { - filePath = paths.join(__dirname, '../mods', filePath); + filePath = paths.join(Config.paths.config, filePath); } configCache.getConfig(filePath, function loaded(err, configJson) { diff --git a/mods/erc_client.js b/core/erc_client.js similarity index 97% rename from mods/erc_client.js rename to core/erc_client.js index 02b42ad5..4fb549f6 100644 --- a/mods/erc_client.js +++ b/core/erc_client.js @@ -1,8 +1,8 @@ /* jslint node: true */ 'use strict'; -const MenuModule = require('../core/menu_module.js').MenuModule; -const stringFormat = require('../core/string_format.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const stringFormat = require('./string_format.js'); // deps const async = require('async'); diff --git a/mods/file_area_filter_edit.js b/core/file_area_filter_edit.js similarity index 96% rename from mods/file_area_filter_edit.js rename to core/file_area_filter_edit.js index cb3322f9..4a53096c 100644 --- a/mods/file_area_filter_edit.js +++ b/core/file_area_filter_edit.js @@ -2,11 +2,11 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const getSortedAvailableFileAreas = require('../core/file_base_area.js').getSortedAvailableFileAreas; -const FileBaseFilters = require('../core/file_base_filter.js'); -const stringFormat = require('../core/string_format.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const getSortedAvailableFileAreas = require('./file_base_area.js').getSortedAvailableFileAreas; +const FileBaseFilters = require('./file_base_filter.js'); +const stringFormat = require('./string_format.js'); // deps const async = require('async'); diff --git a/mods/file_area_list.js b/core/file_area_list.js similarity index 94% rename from mods/file_area_list.js rename to core/file_area_list.js index 0c24f9f8..3bcfd7c2 100644 --- a/mods/file_area_list.js +++ b/core/file_area_list.js @@ -2,23 +2,23 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const ansi = require('../core/ansi_term.js'); -const theme = require('../core/theme.js'); -const FileEntry = require('../core/file_entry.js'); -const stringFormat = require('../core/string_format.js'); -const FileArea = require('../core/file_base_area.js'); -const Errors = require('../core/enig_error.js').Errors; -const ErrNotEnabled = require('../core/enig_error.js').ErrorReasons.NotEnabled; -const ArchiveUtil = require('../core/archive_util.js'); -const Config = require('../core/config.js').config; -const DownloadQueue = require('../core/download_queue.js'); -const FileAreaWeb = require('../core/file_area_web.js'); -const FileBaseFilters = require('../core/file_base_filter.js'); -const resolveMimeType = require('../core/mime_util.js').resolveMimeType; -const isAnsi = require('../core/string_util.js').isAnsi; -const controlCodesToAnsi = require('../core/color_codes.js').controlCodesToAnsi; +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const ansi = require('./ansi_term.js'); +const theme = require('./theme.js'); +const FileEntry = require('./file_entry.js'); +const stringFormat = require('./string_format.js'); +const FileArea = require('./file_base_area.js'); +const Errors = require('./enig_error.js').Errors; +const ErrNotEnabled = require('./enig_error.js').ErrorReasons.NotEnabled; +const ArchiveUtil = require('./archive_util.js'); +const Config = require('./config.js').config; +const DownloadQueue = require('./download_queue.js'); +const FileAreaWeb = require('./file_area_web.js'); +const FileBaseFilters = require('./file_base_filter.js'); +const resolveMimeType = require('./mime_util.js').resolveMimeType; +const isAnsi = require('./string_util.js').isAnsi; +const controlCodesToAnsi = require('./color_codes.js').controlCodesToAnsi; // deps const async = require('async'); diff --git a/mods/file_base_area_select.js b/core/file_base_area_select.js similarity index 88% rename from mods/file_base_area_select.js rename to core/file_base_area_select.js index ca182d6c..8abb668e 100644 --- a/mods/file_base_area_select.js +++ b/core/file_base_area_select.js @@ -2,10 +2,10 @@ 'use strict'; // enigma-bbs -const MenuModule = require('../core/menu_module.js').MenuModule; -const stringFormat = require('../core/string_format.js'); -const getSortedAvailableFileAreas = require('../core/file_base_area.js').getSortedAvailableFileAreas; -const StatLog = require('../core/stat_log.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const stringFormat = require('./string_format.js'); +const getSortedAvailableFileAreas = require('./file_base_area.js').getSortedAvailableFileAreas; +const StatLog = require('./stat_log.js'); // deps const async = require('async'); diff --git a/mods/file_base_download_manager.js b/core/file_base_download_manager.js similarity index 92% rename from mods/file_base_download_manager.js rename to core/file_base_download_manager.js index 382a7305..7444af56 100644 --- a/mods/file_base_download_manager.js +++ b/core/file_base_download_manager.js @@ -2,14 +2,14 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const DownloadQueue = require('../core/download_queue.js'); -const theme = require('../core/theme.js'); -const ansi = require('../core/ansi_term.js'); -const Errors = require('../core/enig_error.js').Errors; -const stringFormat = require('../core/string_format.js'); -const FileAreaWeb = require('../core/file_area_web.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const DownloadQueue = require('./download_queue.js'); +const theme = require('./theme.js'); +const ansi = require('./ansi_term.js'); +const Errors = require('./enig_error.js').Errors; +const stringFormat = require('./string_format.js'); +const FileAreaWeb = require('./file_area_web.js'); // deps const async = require('async'); diff --git a/mods/file_base_search.js b/core/file_base_search.js similarity index 89% rename from mods/file_base_search.js rename to core/file_base_search.js index e984e1a4..adb618d0 100644 --- a/mods/file_base_search.js +++ b/core/file_base_search.js @@ -2,10 +2,10 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const getSortedAvailableFileAreas = require('../core/file_base_area.js').getSortedAvailableFileAreas; -const FileBaseFilters = require('../core/file_base_filter.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const getSortedAvailableFileAreas = require('./file_base_area.js').getSortedAvailableFileAreas; +const FileBaseFilters = require('./file_base_filter.js'); // deps const async = require('async'); diff --git a/mods/file_base_web_download_manager.js b/core/file_base_web_download_manager.js similarity index 92% rename from mods/file_base_web_download_manager.js rename to core/file_base_web_download_manager.js index d171cfdb..dea7c5a8 100644 --- a/mods/file_base_web_download_manager.js +++ b/core/file_base_web_download_manager.js @@ -2,16 +2,16 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const DownloadQueue = require('../core/download_queue.js'); -const theme = require('../core/theme.js'); -const ansi = require('../core/ansi_term.js'); -const Errors = require('../core/enig_error.js').Errors; -const stringFormat = require('../core/string_format.js'); -const FileAreaWeb = require('../core/file_area_web.js'); -const ErrNotEnabled = require('../core/enig_error.js').ErrorReasons.NotEnabled; -const Config = require('../core/config.js').config; +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const DownloadQueue = require('./download_queue.js'); +const theme = require('./theme.js'); +const ansi = require('./ansi_term.js'); +const Errors = require('./enig_error.js').Errors; +const stringFormat = require('./string_format.js'); +const FileAreaWeb = require('./file_area_web.js'); +const ErrNotEnabled = require('./enig_error.js').ErrorReasons.NotEnabled; +const Config = require('./config.js').config; // deps const async = require('async'); diff --git a/mods/file_transfer_protocol_select.js b/core/file_transfer_protocol_select.js similarity index 93% rename from mods/file_transfer_protocol_select.js rename to core/file_transfer_protocol_select.js index 6efa5a93..f1b3dbed 100644 --- a/mods/file_transfer_protocol_select.js +++ b/core/file_transfer_protocol_select.js @@ -2,10 +2,10 @@ 'use strict'; // enigma-bbs -const MenuModule = require('../core/menu_module.js').MenuModule; -const Config = require('../core/config.js').config; -const stringFormat = require('../core/string_format.js'); -const ViewController = require('../core/view_controller.js').ViewController; +const MenuModule = require('./menu_module.js').MenuModule; +const Config = require('./config.js').config; +const stringFormat = require('./string_format.js'); +const ViewController = require('./view_controller.js').ViewController; // deps const async = require('async'); diff --git a/mods/last_callers.js b/core/last_callers.js similarity index 92% rename from mods/last_callers.js rename to core/last_callers.js index afb429d8..3a889468 100644 --- a/mods/last_callers.js +++ b/core/last_callers.js @@ -2,11 +2,11 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const StatLog = require('../core/stat_log.js'); -const User = require('../core/user.js'); -const stringFormat = require('../core/string_format.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const StatLog = require('./stat_log.js'); +const User = require('./user.js'); +const stringFormat = require('./string_format.js'); // deps const moment = require('moment'); diff --git a/mods/msg_area_list.js b/core/msg_area_list.js similarity index 91% rename from mods/msg_area_list.js rename to core/msg_area_list.js index a6a0df4c..eaedbef8 100644 --- a/mods/msg_area_list.js +++ b/core/msg_area_list.js @@ -2,12 +2,12 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const messageArea = require('../core/message_area.js'); -const displayThemeArt = require('../core/theme.js').displayThemeArt; -const resetScreen = require('../core/ansi_term.js').resetScreen; -const stringFormat = require('../core/string_format.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const messageArea = require('./message_area.js'); +const displayThemeArt = require('./theme.js').displayThemeArt; +const resetScreen = require('./ansi_term.js').resetScreen; +const stringFormat = require('./string_format.js'); // deps const async = require('async'); diff --git a/mods/msg_area_post_fse.js b/core/msg_area_post_fse.js similarity index 90% rename from mods/msg_area_post_fse.js rename to core/msg_area_post_fse.js index 21b5d068..c13f39a6 100644 --- a/mods/msg_area_post_fse.js +++ b/core/msg_area_post_fse.js @@ -1,8 +1,8 @@ /* jslint node: true */ 'use strict'; -const FullScreenEditorModule = require('../core/fse.js').FullScreenEditorModule; -const persistMessage = require('../core/message_area.js').persistMessage; +const FullScreenEditorModule = require('./fse.js').FullScreenEditorModule; +const persistMessage = require('./message_area.js').persistMessage; const _ = require('lodash'); const async = require('async'); diff --git a/mods/msg_area_reply_fse.js b/core/msg_area_reply_fse.js similarity index 82% rename from mods/msg_area_reply_fse.js rename to core/msg_area_reply_fse.js index d1cb5faa..24ee5377 100644 --- a/mods/msg_area_reply_fse.js +++ b/core/msg_area_reply_fse.js @@ -1,7 +1,7 @@ /* jslint node: true */ 'use strict'; -var FullScreenEditorModule = require('../core/fse.js').FullScreenEditorModule; +var FullScreenEditorModule = require('./fse.js').FullScreenEditorModule; exports.getModule = AreaReplyFSEModule; diff --git a/mods/msg_area_view_fse.js b/core/msg_area_view_fse.js similarity index 96% rename from mods/msg_area_view_fse.js rename to core/msg_area_view_fse.js index de4657f1..02915f79 100644 --- a/mods/msg_area_view_fse.js +++ b/core/msg_area_view_fse.js @@ -2,8 +2,8 @@ 'use strict'; // ENiGMA½ -const FullScreenEditorModule = require('../core/fse.js').FullScreenEditorModule; -const Message = require('../core/message.js'); +const FullScreenEditorModule = require('./fse.js').FullScreenEditorModule; +const Message = require('./message.js'); // deps const _ = require('lodash'); diff --git a/mods/msg_conf_list.js b/core/msg_conf_list.js similarity index 89% rename from mods/msg_conf_list.js rename to core/msg_conf_list.js index 91c24de4..6f42cf36 100644 --- a/mods/msg_conf_list.js +++ b/core/msg_conf_list.js @@ -2,12 +2,12 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const messageArea = require('../core/message_area.js'); -const displayThemeArt = require('../core/theme.js').displayThemeArt; -const resetScreen = require('../core/ansi_term.js').resetScreen; -const stringFormat = require('../core/string_format.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const messageArea = require('./message_area.js'); +const displayThemeArt = require('./theme.js').displayThemeArt; +const resetScreen = require('./ansi_term.js').resetScreen; +const stringFormat = require('./string_format.js'); // deps const async = require('async'); diff --git a/mods/msg_list.js b/core/msg_list.js similarity index 95% rename from mods/msg_list.js rename to core/msg_list.js index bc80e27b..e5a69e80 100644 --- a/mods/msg_list.js +++ b/core/msg_list.js @@ -2,11 +2,11 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const messageArea = require('../core/message_area.js'); -const stringFormat = require('../core/string_format.js'); -const MessageAreaConfTempSwitcher = require('../core/mod_mixins.js').MessageAreaConfTempSwitcher; +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const messageArea = require('./message_area.js'); +const stringFormat = require('./string_format.js'); +const MessageAreaConfTempSwitcher = require('./mod_mixins.js').MessageAreaConfTempSwitcher; // deps const async = require('async'); diff --git a/mods/nua.js b/core/nua.js similarity index 92% rename from mods/nua.js rename to core/nua.js index 878e0581..7939e739 100644 --- a/mods/nua.js +++ b/core/nua.js @@ -2,12 +2,12 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const User = require('../core/user.js'); -const theme = require('../core/theme.js'); -const login = require('../core/system_menu_method.js').login; -const Config = require('../core/config.js').config; -const messageArea = require('../core/message_area.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const User = require('./user.js'); +const theme = require('./theme.js'); +const login = require('./system_menu_method.js').login; +const Config = require('./config.js').config; +const messageArea = require('./message_area.js'); exports.moduleInfo = { name : 'NUA', diff --git a/mods/onelinerz.js b/core/onelinerz.js similarity index 95% rename from mods/onelinerz.js rename to core/onelinerz.js index 065c0a30..9e89addf 100644 --- a/mods/onelinerz.js +++ b/core/onelinerz.js @@ -2,17 +2,17 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; +const MenuModule = require('./menu_module.js').MenuModule; const { getModDatabasePath, getTransactionDatabase -} = require('../core/database.js'); +} = require('./database.js'); -const ViewController = require('../core/view_controller.js').ViewController; -const theme = require('../core/theme.js'); -const ansi = require('../core/ansi_term.js'); -const stringFormat = require('../core/string_format.js'); +const ViewController = require('./view_controller.js').ViewController; +const theme = require('./theme.js'); +const ansi = require('./ansi_term.js'); +const stringFormat = require('./string_format.js'); // deps const sqlite3 = require('sqlite3'); diff --git a/core/oputil/oputil_common.js b/core/oputil/oputil_common.js index 21e1a6d0..e175a166 100644 --- a/core/oputil/oputil_common.js +++ b/core/oputil/oputil_common.js @@ -45,11 +45,12 @@ function printUsageAndSetExitCode(errMsg, exitCode) { } function getDefaultConfigPath() { - return resolvePath('~/.config/enigma-bbs/config.hjson'); + return './config/'; } function getConfigPath() { - return argv.config ? argv.config : config.getDefaultPath(); + const baseConfigPath = argv.config ? argv.config : config.getDefaultPath(); + return baseConfigPath + 'config.hjson'; } function initConfig(cb) { diff --git a/mods/rumorz.js b/core/rumorz.js similarity index 93% rename from mods/rumorz.js rename to core/rumorz.js index 20aace03..b83853f0 100644 --- a/mods/rumorz.js +++ b/core/rumorz.js @@ -2,13 +2,13 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const theme = require('../core/theme.js'); -const resetScreen = require('../core/ansi_term.js').resetScreen; -const StatLog = require('../core/stat_log.js'); -const renderStringLength = require('../core/string_util.js').renderStringLength; -const stringFormat = require('../core/string_format.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const theme = require('./theme.js'); +const resetScreen = require('./ansi_term.js').resetScreen; +const StatLog = require('./stat_log.js'); +const renderStringLength = require('./string_util.js').renderStringLength; +const stringFormat = require('./string_format.js'); // deps const async = require('async'); diff --git a/mods/telnet_bridge.js b/core/telnet_bridge.js similarity index 94% rename from mods/telnet_bridge.js rename to core/telnet_bridge.js index 1dbb1ae9..3232228a 100644 --- a/mods/telnet_bridge.js +++ b/core/telnet_bridge.js @@ -2,9 +2,9 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const resetScreen = require('../core/ansi_term.js').resetScreen; -const setSyncTermFontWithAlias = require('../core/ansi_term.js').setSyncTermFontWithAlias; +const MenuModule = require('./menu_module.js').MenuModule; +const resetScreen = require('./ansi_term.js').resetScreen; +const setSyncTermFontWithAlias = require('./ansi_term.js').setSyncTermFontWithAlias; // deps const async = require('async'); diff --git a/mods/upload.js b/core/upload.js similarity index 94% rename from mods/upload.js rename to core/upload.js index 30c84c48..5a49a0ca 100644 --- a/mods/upload.js +++ b/core/upload.js @@ -2,20 +2,20 @@ 'use strict'; // enigma-bbs -const MenuModule = require('../core/menu_module.js').MenuModule; -const stringFormat = require('../core/string_format.js'); -const getSortedAvailableFileAreas = require('../core/file_base_area.js').getSortedAvailableFileAreas; -const getAreaDefaultStorageDirectory = require('../core/file_base_area.js').getAreaDefaultStorageDirectory; -const scanFile = require('../core/file_base_area.js').scanFile; -const getFileAreaByTag = require('../core/file_base_area.js').getFileAreaByTag; -const getDescFromFileName = require('../core/file_base_area.js').getDescFromFileName; -const ansiGoto = require('../core/ansi_term.js').goto; -const moveFileWithCollisionHandling = require('../core/file_util.js').moveFileWithCollisionHandling; -const pathWithTerminatingSeparator = require('../core/file_util.js').pathWithTerminatingSeparator; -const Log = require('../core/logger.js').log; -const Errors = require('../core/enig_error.js').Errors; -const FileEntry = require('../core/file_entry.js'); -const isAnsi = require('../core/string_util.js').isAnsi; +const MenuModule = require('./menu_module.js').MenuModule; +const stringFormat = require('./string_format.js'); +const getSortedAvailableFileAreas = require('./file_base_area.js').getSortedAvailableFileAreas; +const getAreaDefaultStorageDirectory = require('./file_base_area.js').getAreaDefaultStorageDirectory; +const scanFile = require('./file_base_area.js').scanFile; +const getFileAreaByTag = require('./file_base_area.js').getFileAreaByTag; +const getDescFromFileName = require('./file_base_area.js').getDescFromFileName; +const ansiGoto = require('./ansi_term.js').goto; +const moveFileWithCollisionHandling = require('./file_util.js').moveFileWithCollisionHandling; +const pathWithTerminatingSeparator = require('./file_util.js').pathWithTerminatingSeparator; +const Log = require('./logger.js').log; +const Errors = require('./enig_error.js').Errors; +const FileEntry = require('./file_entry.js'); +const isAnsi = require('./string_util.js').isAnsi; // deps const async = require('async'); diff --git a/mods/user_list.js b/core/user_list.js similarity index 91% rename from mods/user_list.js rename to core/user_list.js index b2a88e79..be85c586 100644 --- a/mods/user_list.js +++ b/core/user_list.js @@ -1,10 +1,10 @@ /* jslint node: true */ 'use strict'; -const MenuModule = require('../core/menu_module.js').MenuModule; -const User = require('../core/user.js'); -const ViewController = require('../core/view_controller.js').ViewController; -const stringFormat = require('../core/string_format.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const User = require('./user.js'); +const ViewController = require('./view_controller.js').ViewController; +const stringFormat = require('./string_format.js'); const moment = require('moment'); const async = require('async'); diff --git a/mods/whos_online.js b/core/whos_online.js similarity index 87% rename from mods/whos_online.js rename to core/whos_online.js index a0a87829..6abd76ef 100644 --- a/mods/whos_online.js +++ b/core/whos_online.js @@ -2,10 +2,10 @@ 'use strict'; // ENiGMA½ -const MenuModule = require('../core/menu_module.js').MenuModule; -const ViewController = require('../core/view_controller.js').ViewController; -const getActiveNodeList = require('../core/client_connections.js').getActiveNodeList; -const stringFormat = require('../core/string_format.js'); +const MenuModule = require('./menu_module.js').MenuModule; +const ViewController = require('./view_controller.js').ViewController; +const getActiveNodeList = require('./client_connections.js').getActiveNodeList; +const stringFormat = require('./string_format.js'); // deps const async = require('async'); diff --git a/docs/config.md b/docs/config.md index 4e510b35..98a6730f 100644 --- a/docs/config.md +++ b/docs/config.md @@ -2,9 +2,7 @@ Configuration files in ENiGMA½ are simple UTF-8 encoded [HJSON](http://hjson.org/) files. HJSON is just like JSON but simplified and much more resilient to human error. ## System Configuration -The main system configuration file, `config.hjson` both overrides defaults and provides additional configuration such as message areas. The default path is `~/.config/enigma-bbs/config.hjson` though you can override this with the `--config` parameter when invoking `main.js`. Values found in core/config.js may be overridden by simply providing the object members you wish replace. - -**Windows note**: **~** resolves to *C:\Users\YOURLOGINNAME\* on modern Windows installations, e.g. `C:\Users\NuSkooler\.config\enigma-bbs\config.hjson` +The main system configuration file, `config.hjson` both overrides defaults and provides additional configuration such as message areas. The default path is `/enigma-bbs-install-path/config/config.hjson` though you can override the `config.hjson` location with the `--config` parameter when invoking `main.js`. Values found in `core/config.js` may be overridden by simply providing the object members you wish replace. ### Creating a Configuration Your initial configuration skeleton can be created using the `oputil.js` command line utility. From your enigma-bbs root directory: diff --git a/docs/index.md b/docs/index.md index 909ff836..2320829c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -51,11 +51,11 @@ npm install ## Generate a SSH Private Key To utilize the SSH server, a SSH Private Key will need generated. This step can be skipped if you do not wish to enable SSH access. ```bash -openssl genrsa -des3 -out ./misc/ssh_private_key.pem 2048 +openssl genrsa -des3 -out ./config/ssh_private_key.pem 2048 ``` ### Create a Minimal Config -The main system configuration is handled via `~/.config/enigma-bbs/config.hjson`. This is a [HJSON](http://hjson.org/) file (compiliant JSON is also OK). See [Configuration](config.md) for more information. +The main system configuration is handled via `/enigma-bbs-install-path/config/config.hjson`. This is a [HJSON](http://hjson.org/) file (compiliant JSON is also OK). See [Configuration](config.md) for more information. #### Via oputil.js `oputil.js` can be utilized to generate your **initial** configuration. **This is the recommended way for all new users**: @@ -110,7 +110,7 @@ Below is an _example_ configuration. It is recommended that you at least **start Read the Points of Interest below for more info. Also check-out all the other documentation files in the [docs](.) directory. ## Points of Interest -* **The first user you create via register/applying (user ID = 1) will be automatically be added to the `sysops` group. And thus becomes SysOp.** (aka root) +* **The first user you create via register/applying (user ID = 1) will be automatically be added to the `sysops` group, and thus becomes SysOp.** (aka root) * Default port for Telnet is 8888 and for SSH 8889 * Note that on *nix systems port such as telnet/23 are privileged (e.g. require root). See [this SO article](http://stackoverflow.com/questions/16573668/best-practices-when-running-node-js-with-port-80-ubuntu-linode) for some tips on using these ports on your system if desired. * All data is stored by default in Sqlite3 database files, within the `db` sub folder. Including user data, messages, system logs and file meta data. diff --git a/docs/menu_system.md b/docs/menu_system.md index 026ef648..aef51199 100644 --- a/docs/menu_system.md +++ b/docs/menu_system.md @@ -3,7 +3,7 @@ ENiGMA½'s menu system is highly flexible and moddable. The possibilities are al This document and others will refer to `menu.hjson`. This should be seen as an alias to `yourboardname.hjson` (or whatever you reference in `config.hjson` using the `menuFile` property — see below). By modifying your `menu.hjson` you will be able to create a custom experience unique to your board. -The default `menu.hjson` file lives within the `mods` directory. It is **highly recommended** to specify another file by setting the `menuFile` property in your `config.hjson` file: +The default `menu.hjson` file lives within the `config` directory. It is **highly recommended** to specify another file by setting the `menuFile` property in your `config.hjson` file: ```hjson general: { /* Can also specify a full path */ diff --git a/docs/modding.md b/docs/modding.md index 9449a91e..609729b4 100644 --- a/docs/modding.md +++ b/docs/modding.md @@ -7,7 +7,7 @@ See [Configuration](config.md) See [Menu System](menu_system.md) ## Theming -Take a look at how the default `luciano_blocktronics` theme found under `mods/themes` works! +Take a look at how the default `luciano_blocktronics` theme found under `art/themes` works! TODO document me! diff --git a/docs/mods.md b/docs/mods.md index 3abc7e2f..f73a3fc6 100644 --- a/docs/mods.md +++ b/docs/mods.md @@ -1,5 +1,5 @@ # Mods - +Custom mods should be added to `/enigma-install-path/mods`. ## Existing Mods * **Married Bob Fetch Event**: An event for fetching the latest Married Bob ANSI's for display on you board. ACiDic release [ACD-MB4E.ZIP](https://l33t.codes/outgoing/ACD/ACD-MB4E.ZIP). Can also be [found on GitHub](https://github.com/NuSkooler/enigma-bbs-married_bob_evt) diff --git a/mods/.keep b/mods/.keep new file mode 100644 index 00000000..e69de29b diff --git a/package.json b/package.json index 29bd16da..566a454d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,6 @@ "buffers": "NuSkooler/node-buffers", "bunyan": "^1.8.12", "exiftool": "^0.0.3", - "farmhash": "^2.0.4", "fs-extra": "^4.0.1", "graceful-fs": "^4.1.11", "hashids": "^1.1.1", @@ -52,6 +51,7 @@ "uuid": "^3.1.0", "uuid-parse": "^1.0.0", "ws": "^3.1.0", + "xxhash": "^0.2.4", "yazl" : "^2.4.2" }, "devDependencies": {},