From 0062726ee946bc71b9755b4df4dbd9b4fdc759ff Mon Sep 17 00:00:00 2001 From: Botanic Date: Thu, 15 Aug 2013 02:57:19 -0700 Subject: [PATCH] Merge with quitta-gsoc-2013 --- .hgeol | 3 + code/CMakeLists.txt | 4 +- code/CMakeModules/PCHSupport.cmake | 17 +- code/CMakeModules/nel.cmake | 7 +- code/nel/CMakeLists.txt | 10 +- code/nel/include/nel/gui/interface_link.h | 10 +- code/nel/include/nel/gui/lua_helper.h | 5 +- code/nel/include/nel/gui/lua_helper_inline.h | 30 + code/nel/include/nel/gui/widget_manager.h | 8 +- code/nel/include/nel/misc/types_nl.h | 2 + .../src/3d/driver/opengl/driver_opengl.cpp | 8 +- code/nel/src/3d/driver/opengl/driver_opengl.h | 4 +- .../driver/opengl/driver_opengl_texture.cpp | 13 +- code/nel/src/3d/zone_lighter.cpp | 5 +- code/nel/src/gui/dbgroup_combo_box.cpp | 6 +- code/nel/src/gui/dbgroup_select_number.cpp | 2 + code/nel/src/gui/interface_group.cpp | 3 +- code/nel/src/gui/interface_link.cpp | 123 +- code/nel/src/gui/interface_parser.cpp | 5 +- code/nel/src/gui/link_hack.cpp | 4 + code/nel/src/gui/lua_helper.cpp | 43 +- code/nel/src/gui/lua_object.cpp | 4 + code/nel/src/gui/widget_manager.cpp | 52 +- code/nel/tools/3d/CMakeLists.txt | 116 +- .../tools/3d/object_viewer/object_viewer.cpp | 3 +- .../src/images/nel_ide_load.png | Bin 45864 -> 137855 bytes .../scripts/startup/nel_material.ms | 60 +- code/nel/tools/3d/shape2obj/CMakeLists.txt | 9 + code/nel/tools/3d/shape2obj/main.cpp | 10 +- code/nel/tools/CMakeLists.txt | 52 +- .../generate_simple_max_exporters.py | 2 - .../generate_tagged_max_exporters.py | 2 + .../processes/pacs_prim/1_export.py | 54 +- .../pacs_prim/maxscript/pacs_prim_export.ms | 154 +- code/ryzom/CMakeLists.txt | 14 + code/ryzom/client/CMakeLists.txt | 7 + code/ryzom/client/client_default.cfg | 32 +- code/ryzom/client/client_default.cfg.in | 32 +- .../gamedev/interfaces_v3/bg_downloader.lua | 2 +- .../data/gamedev/interfaces_v3/config.xml | 15 +- .../gamedev/interfaces_v3/game_r2_loading.lua | 2 +- .../data/gamedev/interfaces_v3/help.xml | 63 +- .../gamedev/interfaces_v3/interaction.lua | 2 +- .../data/gamedev/interfaces_v3/login_main.xml | 8 +- .../client/data/gamedev/interfaces_v3/map.xml | 4 +- .../gamedev/interfaces_v3/out_v2_appear.lua | 2 +- .../data/gamedev/interfaces_v3/outpost.lua | 25 +- .../data/gamedev/interfaces_v3/outpost.xml | 3 +- .../data/gamedev/interfaces_v3/player.lua | 4 +- .../interfaces_v3/ring_access_point.lua | 2 +- code/ryzom/client/src/CMakeLists.txt | 9 +- code/ryzom/client/src/cdb_synchronised.cpp | 6 +- code/ryzom/client/src/cdb_synchronised.h | 2 + code/ryzom/client/src/commands.cpp | 2 +- code/ryzom/client/src/cursor_functions.cpp | 4 +- code/ryzom/client/src/entities.cpp | 33 +- code/ryzom/client/src/entities.h | 19 + code/ryzom/client/src/entity_cl.cpp | 17 +- code/ryzom/client/src/entity_cl.h | 3 +- .../src/interface_v3/action_handler_misc.cpp | 5 +- .../client/src/interface_v3/dbctrl_sheet.cpp | 4 +- .../interface_v3/group_in_scene_user_info.cpp | 113 +- .../interface_v3/group_in_scene_user_info.h | 5 +- .../src/interface_v3/interface_manager.cpp | 11 +- .../src/interface_v3/interface_manager.h | 3 +- .../client/src/interface_v3/lua_ihm_ryzom.cpp | 10 +- .../src/interface_v3/people_interraction.cpp | 3 +- .../src/interface_v3/sphrase_manager.cpp | 12 +- .../client/src/interface_v3/sphrase_manager.h | 4 + code/ryzom/client/src/main_loop.cpp | 12 +- .../ryzom/client/src/motion/user_controls.cpp | 4 +- code/ryzom/client/src/motion/user_controls.h | 5 + code/ryzom/client/src/net_manager.cpp | 18 +- code/ryzom/client/src/net_manager.h | 8 + .../client/src/r2/dmc/com_lua_module.cpp | 21 +- code/ryzom/client/src/r2/editor.cpp | 6 +- code/ryzom/client/src/r2/tool.cpp | 4 +- code/ryzom/client/src/r2/tool.h | 1 + .../ryzom/client/src/session_browser_impl.cpp | 10 +- code/ryzom/client/src/weather.cpp | 5 +- code/ryzom/common/data_common/database.xml | 3330 ++++++++--------- code/ryzom/common/data_common/msg.xml | 2330 ++++++------ code/ryzom/common/src/game_share/crypt.cpp | 20 +- code/ryzom/server/src/CMakeLists.txt | 11 +- code/ryzom/tools/CMakeLists.txt | 6 +- .../ecosystems/desert/directories.py | 1 + .../ecosystems/jungle/directories.py | 1 + .../ecosystems/lacustre/directories.py | 1 + .../ecosystems/primes_racines/directories.py | 1 + .../ryzom_ams/ams_lib/autoload/assigned.php | 120 + .../ryzom_ams/ams_lib/autoload/dblayer.php | 62 +- .../ryzom_ams/ams_lib/autoload/forwarded.php | 98 + .../ams_lib/autoload/gui_elements.php | 79 + .../ryzom_ams/ams_lib/autoload/helpers.php | 112 +- .../ams_lib/autoload/in_support_group.php | 77 + .../ams_lib/autoload/mail_handler.php | 378 ++ .../ryzom_ams/ams_lib/autoload/pagination.php | 97 + .../ryzom_ams/ams_lib/autoload/querycache.php | 83 + .../server/ryzom_ams/ams_lib/autoload/sql.php | 10 - .../ams_lib/autoload/support_group.php | 265 ++ .../ryzom_ams/ams_lib/autoload/sync.php | 20 +- .../ryzom_ams/ams_lib/autoload/ticket.php | 285 +- .../ams_lib/autoload/ticket_category.php | 21 +- .../ams_lib/autoload/ticket_content.php | 13 +- .../ryzom_ams/ams_lib/autoload/ticket_log.php | 180 + .../ams_lib/autoload/ticket_queue.php | 89 + .../ams_lib/autoload/ticket_queue_handler.php | 58 + .../ams_lib/autoload/ticket_reply.php | 101 +- .../ams_lib/autoload/ticket_user.php | 116 +- .../ryzom_ams/ams_lib/autoload/users.php | 35 +- .../ams_lib/configs/ingame_layout.ini | 44 + .../ryzom_ams/ams_lib/cron/mail_cron.php | 7 + .../ams_lib/ingame_templates/createticket.tpl | 80 + .../ams_lib/ingame_templates/home.tpl | 55 + .../ams_lib/ingame_templates/layout.tpl | 34 + .../ams_lib/ingame_templates/layout_admin.tpl | 19 + .../ams_lib/ingame_templates/layout_mod.tpl | 18 + .../ams_lib/ingame_templates/layout_user.tpl | 24 + .../ams_lib/ingame_templates/login.tpl | 40 + .../ams_lib/ingame_templates/register.tpl | 4 +- .../ams_lib/ingame_templates/settings.tpl | 217 ++ .../ams_lib/ingame_templates/sgroup_list.tpl | 114 + .../ams_lib/ingame_templates/show_queue.tpl | 222 ++ .../ams_lib/ingame_templates/show_reply.tpl | 88 + .../ams_lib/ingame_templates/show_sgroup.tpl | 113 + .../ams_lib/ingame_templates/show_ticket.tpl | 284 ++ .../ingame_templates/show_ticket_log.tpl | 88 + .../ams_lib/ingame_templates/show_user.tpl | 163 + .../ams_lib/ingame_templates/userlist.tpl | 96 + .../server/ryzom_ams/ams_lib/libinclude.php | 6 +- .../ryzom_ams/ams_lib/translations/en.ini | 61 +- .../ryzom_ams/ams_lib/translations/fr.ini | 59 +- .../assets/android_app/Ryzom_Core_AMS.7z | Bin 0 -> 25758 bytes .../ryzom_ams/assets/android_app/info.txt | 1 + .../tools/server/ryzom_ams/www/config.php | 31 +- .../ryzom_ams/www/html/autoload/webusers.php | 132 +- .../ryzom_ams/www/html/func/add_sgroup.php | 34 + .../ryzom_ams/www/html/func/add_user.php | 5 +- .../www/html/func/add_user_to_sgroup.php | 42 + .../ryzom_ams/www/html/func/change_info.php | 14 +- .../ryzom_ams/www/html/func/change_mail.php | 19 +- .../www/html/func/change_password.php | 11 +- .../ryzom_ams/www/html/func/create_ticket.php | 14 +- .../server/ryzom_ams/www/html/func/login.php | 11 +- .../www/html/func/reply_on_ticket.php | 51 + .../www/html/img/ryzomcore_166_62.png | Bin 0 -> 16654 bytes .../www/html/inc/change_permission.php | 40 + .../ryzom_ams/www/html/inc/createticket.php | 11 +- .../ryzom_ams/www/html/inc/libuserlist.php | 68 - .../server/ryzom_ams/www/html/inc/login.php | 16 + .../ryzom_ams/www/html/inc/settings.php | 16 +- .../ryzom_ams/www/html/inc/sgroup_list.php | 31 + .../ryzom_ams/www/html/inc/show_queue.php | 123 + .../ryzom_ams/www/html/inc/show_reply.php | 46 + .../ryzom_ams/www/html/inc/show_sgroup.php | 56 + .../ryzom_ams/www/html/inc/show_ticket.php | 82 + .../www/html/inc/show_ticket_log.php | 56 + .../ryzom_ams/www/html/inc/show_user.php | 41 +- .../server/ryzom_ams/www/html/inc/syncing.php | 28 + .../ryzom_ams/www/html/inc/userlist.php | 22 +- .../tools/server/ryzom_ams/www/html/index.php | 23 +- .../ryzom_ams/www/html/sql/DBScheme.png | Bin 114396 -> 124474 bytes .../server/ryzom_ams/www/html/sql/install.php | 543 ++- .../ryzom_ams/www/html/sql/ticketsql.sql | 166 +- .../www/html/sql/ticketsystemmodel.mwb | Bin 12381 -> 16833 bytes .../tools/server/ryzom_ams/www/html/table.php | 704 ++++ .../www/html/templates/createticket.tpl | 2 +- .../ryzom_ams/www/html/templates/layout.tpl | 2 +- .../www/html/templates/layout_admin.tpl | 7 +- .../www/html/templates/layout_mod.tpl | 14 + .../ryzom_ams/www/html/templates/register.tpl | 4 +- .../ryzom_ams/www/html/templates/settings.tpl | 2 +- .../www/html/templates/sgroup_list.tpl | 108 + .../www/html/templates/show_queue.tpl | 197 + .../www/html/templates/show_reply.tpl | 33 + .../www/html/templates/show_sgroup.tpl | 103 + .../www/html/templates/show_ticket.tpl | 235 ++ .../www/html/templates/show_ticket_log.tpl | 38 + .../www/html/templates/show_user.tpl | 29 +- .../{libuserlist.tpl => syncing.tpl} | 19 +- .../ryzom_ams/www/html/templates/userlist.tpl | 44 +- 181 files changed, 10578 insertions(+), 3938 deletions(-) create mode 100644 code/nel/tools/3d/shape2obj/CMakeLists.txt create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/assigned.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/forwarded.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/gui_elements.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/in_support_group.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/pagination.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/querycache.php delete mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sql.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/support_group.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_log.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_queue.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_queue_handler.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/configs/ingame_layout.ini create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/cron/mail_cron.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/createticket.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/home.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_admin.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_mod.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_user.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/login.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/settings.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/sgroup_list.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_queue.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_reply.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_sgroup.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_ticket.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_ticket_log.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_user.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/userlist.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/assets/android_app/Ryzom_Core_AMS.7z create mode 100644 code/ryzom/tools/server/ryzom_ams/assets/android_app/info.txt create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/func/add_sgroup.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/func/add_user_to_sgroup.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/func/reply_on_ticket.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/img/ryzomcore_166_62.png create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/change_permission.php delete mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/libuserlist.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/login.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/sgroup_list.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/show_queue.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/show_reply.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/show_sgroup.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/show_ticket.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/show_ticket_log.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/syncing.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_mod.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/sgroup_list.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/show_queue.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/show_reply.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/show_sgroup.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/show_ticket.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/show_ticket_log.tpl rename code/ryzom/tools/server/ryzom_ams/www/html/templates/{libuserlist.tpl => syncing.tpl} (75%) diff --git a/.hgeol b/.hgeol index e13b08ced..c7a59fec5 100644 --- a/.hgeol +++ b/.hgeol @@ -1,6 +1,9 @@ [patterns] **.h = native **.cpp = native + +**/database.xml = BIN +**/msg.xml = BIN **.txt = native **.xml = native diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 1ae01610f..0cd9afd54 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -111,9 +111,11 @@ FIND_PACKAGE(LibXml2 REQUIRED) FIND_PACKAGE(PNG REQUIRED) FIND_PACKAGE(Jpeg) +IF(WITH_STATIC_LIBXML2) + SET(LIBXML2_DEFINITIONS ${LIBXML2_DEFINITIONS} -DLIBXML_STATIC) +ENDIF(WITH_STATIC_LIBXML2) IF(WITH_STATIC) # libxml2 could need winsock2 library - SET(LIBXML2_DEFINITIONS ${LIBXML2_DEFINITIONS} -DLIBXML_STATIC) SET(LIBXML2_LIBRARIES ${LIBXML2_LIBRARIES} ${WINSOCK2_LIB}) # on Mac OS X libxml2 requires iconv and liblzma diff --git a/code/CMakeModules/PCHSupport.cmake b/code/CMakeModules/PCHSupport.cmake index d444bfa3d..042f6b0cc 100644 --- a/code/CMakeModules/PCHSupport.cmake +++ b/code/CMakeModules/PCHSupport.cmake @@ -33,9 +33,9 @@ ENDIF(MSVC) # Set PCH_FLAGS for common flags, PCH_ARCH_XXX_FLAGS for specific archs flags and PCH_ARCHS for archs MACRO(PCH_SET_COMPILE_FLAGS _target) SET(PCH_FLAGS) - SET(PCH_ARCHS) - - SET(FLAGS) + SET(PCH_ARCHS) + SET(_FLAGS) + LIST(APPEND _FLAGS ${CMAKE_CXX_FLAGS}) STRING(TOUPPER "${CMAKE_BUILD_TYPE}" _UPPER_BUILD) @@ -81,10 +81,15 @@ MACRO(PCH_SET_COMPILE_FLAGS _target) LIST(APPEND _FLAGS " ${_directory_flags}") LIST(APPEND _FLAGS " ${_directory_definitions}") - STRING(REGEX REPLACE " +" " " _FLAGS ${_FLAGS}) - # Format definitions - SEPARATE_ARGUMENTS(_FLAGS) + IF(MSVC) + # Fix path with space + SEPARATE_ARGUMENTS(_FLAGS UNIX_COMMAND "${_FLAGS}") + ELSE(MSVC) + STRING(REGEX REPLACE " +" " " _FLAGS ${_FLAGS}) + SEPARATE_ARGUMENTS(_FLAGS) + ENDIF(MSVC) + IF(CLANG) # Determining all architectures and get common flags diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index 72e2d07e4..834a5da5b 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -123,7 +123,7 @@ MACRO(NL_DEFAULT_PROPS name label) VERSION ${NL_VERSION} SOVERSION ${NL_VERSION_MAJOR} COMPILE_FLAGS "/GA" - LINK_FLAGS "/VERSION:${NL_VERSION}") + LINK_FLAGS "/VERSION:${NL_VERSION_MAJOR}.${NL_VERSION_MINOR}") ENDIF(${type} STREQUAL EXECUTABLE AND WIN32) IF(WITH_STLPORT AND WIN32) @@ -247,6 +247,11 @@ MACRO(NL_SETUP_DEFAULT_OPTIONS) ELSE(WIN32) OPTION(WITH_STATIC "With static libraries." OFF) ENDIF(WIN32) + IF (WITH_STATIC) + OPTION(WITH_STATIC_LIBXML2 "With static libxml2" ON ) + ELSE(WITH_STATIC) + OPTION(WITH_STATIC_LIBXML2 "With static libxml2" OFF) + ENDIF(WITH_STATIC) OPTION(WITH_STATIC_DRIVERS "With static drivers." OFF) IF(WIN32) OPTION(WITH_EXTERNAL "With provided external." ON ) diff --git a/code/nel/CMakeLists.txt b/code/nel/CMakeLists.txt index 745278cd7..1929135b4 100644 --- a/code/nel/CMakeLists.txt +++ b/code/nel/CMakeLists.txt @@ -68,7 +68,11 @@ IF(WITH_NEL_SAMPLES) ADD_SUBDIRECTORY(samples) ENDIF(WITH_NEL_SAMPLES) -IF(WITH_NEL_TOOLS) - FIND_PACKAGE(Squish) +# Allow to compile only max plugins without other tools. +IF(WITH_NEL_TOOLS OR WITH_NEL_MAXPLUGIN) + IF(WITH_NEL_TOOLS) + FIND_PACKAGE(Squish) + ENDIF(WITH_NEL_TOOLS) ADD_SUBDIRECTORY(tools) -ENDIF(WITH_NEL_TOOLS) +ENDIF(WITH_NEL_TOOLS OR WITH_NEL_MAXPLUGIN) + diff --git a/code/nel/include/nel/gui/interface_link.h b/code/nel/include/nel/gui/interface_link.h index ffa6ac0c7..42fb2bbcf 100644 --- a/code/nel/include/nel/gui/interface_link.h +++ b/code/nel/include/nel/gui/interface_link.h @@ -66,6 +66,11 @@ namespace NLGUI */ bool affect(const CInterfaceExprValue &value); }; + struct CCDBTargetInfo + { + NLMISC::CRefPtr Leaf; + std::string LeafName; + }; /// Updates triggered interface links when triggered by the observed branch @@ -85,7 +90,7 @@ namespace NLGUI * If there are no target element, the link is permanent (removed at exit) * NB : The target is not updated during this call. */ - bool init(const std::vector &targets, const std::string &expr, const std::string &actionHandler, const std::string &ahParams, const std::string &ahCond, CInterfaceGroup *parent); + bool init(const std::vector &targets, const std::vector &cdbTargets, const std::string &expr, const std::string &actionHandler, const std::string &ahParams, const std::string &ahCond, CInterfaceGroup *parent); // force all the links that have been created to update their targets. This can be called when the interface has been loaded, and when the databse entries have been retrieved. static void updateAllLinks(); // force all trigered links to be updated @@ -119,6 +124,7 @@ namespace NLGUI * \return true if all targets are valid */ static bool splitLinkTargets(const std::string &targets, CInterfaceGroup *parentGroup, std::vector &targetsVect); + static bool splitLinkTargetsExt(const std::string &targets, CInterfaceGroup *parentGroup, std::vector &targetsVect, std::vector &cdbTargetsVect); //////////////////////////////////////////////////////////////////////////////////////////////////////// private: friend struct CRemoveTargetPred; @@ -135,12 +141,14 @@ namespace NLGUI typedef std::vector TNodeVect; private: std::vector _Targets; + std::vector _CDBTargets; TNodeVect _ObservedNodes; std::string _Expr; CInterfaceExprNode *_ParseTree; std::string _ActionHandler; std::string _AHParams; std::string _AHCond; + CInterfaceExprNode *_AHCondParsed; CInterfaceGroup *_AHParent; static TLinkList _LinkList; TLinkList::iterator _ListEntry; diff --git a/code/nel/include/nel/gui/lua_helper.h b/code/nel/include/nel/gui/lua_helper.h index 10b78daa8..69639fc04 100644 --- a/code/nel/include/nel/gui/lua_helper.h +++ b/code/nel/include/nel/gui/lua_helper.h @@ -217,6 +217,7 @@ namespace NLGUI void clear() { setTop(0); } int getTop(); bool empty() { return getTop() == 0; } + void pushGlobalTable(); void pushValue(int index); // copie nth element of stack to the top of the stack void remove(int index); // remove nth element of stack void insert(int index); // insert last element of the stack before the given position @@ -301,7 +302,8 @@ namespace NLGUI /** Helper : Execute a function by name. Lookup for the function is done in the table at the index 'funcTableIndex' * the behaviour is the same than with call of pcall. */ - int pcallByName(const char *functionName, int nargs, int nresults, int funcTableIndex = LUA_GLOBALSINDEX, int errfunc = 0); + int pcallByNameGlobal(const char *functionName, int nargs, int nresults, int errfunc = 0); + int pcallByName(const char *functionName, int nargs, int nresults, int funcTableIndex, int errfunc = 0); // push a C closure (pop n element from the stack and associate with the function) void pushCClosure(lua_CFunction function, int n); @@ -367,6 +369,7 @@ namespace NLGUI CLuaState &operator=(const CLuaState &/* other */) { nlassert(0); return *this; } void executeScriptInternal(const std::string &code, const std::string &dbgSrc, int numRet = 0); + int pcallByNameInternal(const char *functionName, int nargs, int nresults, int errfunc, int initialStackSize); }; diff --git a/code/nel/include/nel/gui/lua_helper_inline.h b/code/nel/include/nel/gui/lua_helper_inline.h index 0b9113ce1..01afd142f 100644 --- a/code/nel/include/nel/gui/lua_helper_inline.h +++ b/code/nel/include/nel/gui/lua_helper_inline.h @@ -42,10 +42,16 @@ inline void CLuaState::checkIndex(int index) //H_AUTO(Lua_CLuaState_checkIndex) // NB : more restrictive test that in the documentation there, because // we don't expose the check stack function +#if LUA_VERSION_NUM >= 502 + nlassert( (index!=0 && abs(index) <= getTop()) + || index == LUA_REGISTRYINDEX + ); +#else nlassert( (index!=0 && abs(index) <= getTop()) || index == LUA_REGISTRYINDEX || index == LUA_GLOBALSINDEX ); +#endif } //================================================================================ @@ -75,6 +81,18 @@ inline void CLuaState::setTop(int index) lua_settop(_State, index); } +//================================================================================ +inline void CLuaState::pushGlobalTable() +{ + //H_AUTO(Lua_CLuaState_pushGlobalTable) +#if LUA_VERSION_NUM >= 502 + lua_pushglobaltable(_State); +#else + checkIndex(LUA_GLOBALSINDEX); + lua_pushvalue(_State, LUA_GLOBALSINDEX); +#endif +} + //================================================================================ inline void CLuaState::pushValue(int index) { @@ -243,7 +261,11 @@ inline size_t CLuaState::strlen(int index) { //H_AUTO(Lua_CLuaState_strlen) checkIndex(index); +#if LUA_VERSION_NUM >= 502 + return lua_rawlen(_State, index); +#else return lua_strlen(_State, index); +#endif } //================================================================================ @@ -342,7 +364,11 @@ inline bool CLuaState::equal(int index1, int index2) //H_AUTO(Lua_CLuaState_equal) checkIndex(index1); checkIndex(index2); +#if LUA_VERSION_NUM >= 502 + return lua_compare(_State, index1, index2, LUA_OPEQ) != 0; +#else return lua_equal(_State, index1, index2) != 0; +#endif } //================================================================================ @@ -376,7 +402,11 @@ inline bool CLuaState::lessThan(int index1, int index2) //H_AUTO(Lua_CLuaState_lessThan) checkIndex(index1); checkIndex(index2); +#if LUA_VERSION_NUM >= 502 + return lua_compare(_State, index1, index2, LUA_OPLT) != 0; +#else return lua_lessthan(_State, index1, index2) != 0; +#endif } diff --git a/code/nel/include/nel/gui/widget_manager.h b/code/nel/include/nel/gui/widget_manager.h index 7fedc6240..00723faea 100644 --- a/code/nel/include/nel/gui/widget_manager.h +++ b/code/nel/include/nel/gui/widget_manager.h @@ -444,7 +444,7 @@ namespace NLGUI } float getAlphaRolloverSpeed(); - void resetAlphaRolloverSpeed(); + void resetAlphaRolloverSpeedProps(); void setContainerAlpha( uint8 alpha ); uint8 getContainerAlpha() const { return _ContainerAlpha; } @@ -454,6 +454,7 @@ namespace NLGUI uint8 getGlobalRolloverFactorContainer() const { return _GlobalRolloverFactorContainer; } void updateGlobalAlphas(); + void resetGlobalAlphasProps(); const SInterfaceTimes& getInterfaceTimes() const{ return interfaceTimes; } void updateInterfaceTimes( const SInterfaceTimes × ){ interfaceTimes = times; } @@ -527,6 +528,11 @@ namespace NLGUI NLMISC::CCDBNodeLeaf *_BProp; NLMISC::CCDBNodeLeaf *_AProp; NLMISC::CCDBNodeLeaf *_AlphaRolloverSpeedDB; + + NLMISC::CCDBNodeLeaf *_GlobalContentAlphaDB; + NLMISC::CCDBNodeLeaf *_GlobalContainerAlphaDB; + NLMISC::CCDBNodeLeaf *_GlobalContentRolloverFactorDB; + NLMISC::CCDBNodeLeaf *_GlobalContainerRolloverFactorDB; uint8 _ContainerAlpha; uint8 _GlobalContentAlpha; diff --git a/code/nel/include/nel/misc/types_nl.h b/code/nel/include/nel/misc/types_nl.h index 6485960f7..ce9d88bae 100644 --- a/code/nel/include/nel/misc/types_nl.h +++ b/code/nel/include/nel/misc/types_nl.h @@ -104,6 +104,8 @@ // Windows 64bits platform SDK compilers doesn't support inline assembler # define NL_NO_ASM # endif +# undef _WIN32_WINNT +# define _WIN32_WINNT 0x0600 // force VISTA minimal version in 64 bits # endif // define NOMINMAX to be sure that windows includes will not define min max macros, but instead, use the stl template # define NOMINMAX diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.cpp b/code/nel/src/3d/driver/opengl/driver_opengl.cpp index 29e14a1a0..08b883e12 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl.cpp @@ -1488,7 +1488,10 @@ void CDriverGL::enableUsedTextureMemorySum (bool enable) H_AUTO_OGL(CDriverGL_enableUsedTextureMemorySum ) if (enable) + { nlinfo ("3D: PERFORMANCE INFO: enableUsedTextureMemorySum has been set to true in CDriverGL"); + _TextureUsed.reserve(512); + } _SumTextureMemoryUsed=enable; } @@ -1502,7 +1505,7 @@ uint32 CDriverGL::getUsedTextureMemory() const uint32 memory=0; // For each texture used - set::const_iterator ite=_TextureUsed.begin(); + std::vector::const_iterator ite = _TextureUsed.begin(); while (ite!=_TextureUsed.end()) { // Get the gl texture @@ -1510,7 +1513,8 @@ uint32 CDriverGL::getUsedTextureMemory() const gltext= (*ite); // Sum the memory used by this texture - memory+=gltext->TextureMemory; + if (gltext) + memory+=gltext->TextureMemory; // Next texture ite++; diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.h b/code/nel/src/3d/driver/opengl/driver_opengl.h index bfe73492d..ee6431dc4 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.h +++ b/code/nel/src/3d/driver/opengl/driver_opengl.h @@ -196,6 +196,8 @@ public: bool initFrameBufferObject(ITexture * tex); bool activeFrameBufferObject(ITexture * tex); + + std::vector::size_type TextureUsedIdx; }; @@ -1273,7 +1275,7 @@ private: uint32 _NbSetupMaterialCall; uint32 _NbSetupModelMatrixCall; bool _SumTextureMemoryUsed; - std::set _TextureUsed; + std::vector _TextureUsed; uint computeMipMapMemoryUsage(uint w, uint h, GLint glfmt) const; // VBHard Lock Profiling diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp index 77954a8e3..055f8d99d 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp @@ -79,6 +79,8 @@ CTextureDrvInfosGL::CTextureDrvInfosGL(IDriver *drv, ItTexDrvInfoPtrMap it, CDri InitFBO = false; AttachDepthStencil = true; UsePackedDepthStencil = drvGl->supportPackedDepthStencil(); + + TextureUsedIdx = 0; } // *************************************************************************** CTextureDrvInfosGL::~CTextureDrvInfosGL() @@ -91,7 +93,10 @@ CTextureDrvInfosGL::~CTextureDrvInfosGL() _Driver->_AllocatedTextureMemory-= TextureMemory; // release in TextureUsed. - _Driver->_TextureUsed.erase (this); + if (TextureUsedIdx < _Driver->_TextureUsed.size() && _Driver->_TextureUsed[TextureUsedIdx] == this) + { + _Driver->_TextureUsed[TextureUsedIdx] = NULL; + } if(InitFBO) { @@ -1492,7 +1497,11 @@ bool CDriverGL::activateTexture(uint stage, ITexture *tex) if (_SumTextureMemoryUsed) { // Insert the pointer of this texture - _TextureUsed.insert (gltext); + if (gltext->TextureUsedIdx >= _TextureUsed.size() || _TextureUsed[gltext->TextureUsedIdx] != gltext) + { + gltext->TextureUsedIdx = _TextureUsed.size(); + _TextureUsed.push_back(gltext); + } } if(tex->isTextureCube()) diff --git a/code/nel/src/3d/zone_lighter.cpp b/code/nel/src/3d/zone_lighter.cpp index 112df54e0..0fe7e9b48 100644 --- a/code/nel/src/3d/zone_lighter.cpp +++ b/code/nel/src/3d/zone_lighter.cpp @@ -1170,8 +1170,7 @@ void CZoneLighter::light (CLandscape &landscape, CZone& output, uint zoneToLight { // Last patch uint lastPatch=firstPatch+patchCountByThread; - if (lastPatch>patchCount) - lastPatch=patchCount; + lastPatch %= patchCount; // Last patch computed _LastPatchComputed[process] = firstPatch; @@ -3772,6 +3771,8 @@ uint CZoneLighter::getAPatch (uint process) uint index = _LastPatchComputed[process]; uint firstIndex = index; + nlassert(index < _PatchInfo.size()); + if (access.value().size() == 0) // no more patches return 0xffffffff; diff --git a/code/nel/src/gui/dbgroup_combo_box.cpp b/code/nel/src/gui/dbgroup_combo_box.cpp index 83baa93b3..61b8ec3e6 100644 --- a/code/nel/src/gui/dbgroup_combo_box.cpp +++ b/code/nel/src/gui/dbgroup_combo_box.cpp @@ -28,10 +28,12 @@ using namespace std; using namespace NLMISC; -NLMISC_REGISTER_OBJECT(CViewBase, CDBGroupComboBox, std::string, "combo_box"); - namespace NLGUI { + NLMISC_REGISTER_OBJECT(CViewBase, CDBGroupComboBox, std::string, "combo_box"); + + void force_link_dbgroup_combo_box_cpp() { } + // Compare strings static inline bool lt_text(const std::pair &s1, const std::pair &s2) { diff --git a/code/nel/src/gui/dbgroup_select_number.cpp b/code/nel/src/gui/dbgroup_select_number.cpp index 409bf838f..b3dc2e8f1 100644 --- a/code/nel/src/gui/dbgroup_select_number.cpp +++ b/code/nel/src/gui/dbgroup_select_number.cpp @@ -31,6 +31,8 @@ namespace NLGUI { NLMISC_REGISTER_OBJECT(CViewBase, CDBGroupSelectNumber, std::string, "select_number"); + void force_link_dbgroup_select_number_cpp() { } + // *************************************************************************** CDBGroupSelectNumber::CDBGroupSelectNumber(const TCtorParam ¶m) : CInterfaceGroup(param) diff --git a/code/nel/src/gui/interface_group.cpp b/code/nel/src/gui/interface_group.cpp index f981814ba..4e8919e5c 100644 --- a/code/nel/src/gui/interface_group.cpp +++ b/code/nel/src/gui/interface_group.cpp @@ -2325,7 +2325,8 @@ namespace NLGUI _LUAOnDbChange[dbList]= newLink; // Init and attach to list of untargeted links std::vector noTargets; - newLink->init(noTargets, NLMISC::toString("depends(%s)", dbList.c_str()), "lua", script, "", this); + std::vector noCdbTargets; + newLink->init(noTargets, noCdbTargets, NLMISC::toString("depends(%s)", dbList.c_str()), "lua", script, "", this); } // ------------------------------------------------------------------------------------------------ diff --git a/code/nel/src/gui/interface_link.cpp b/code/nel/src/gui/interface_link.cpp index d672e9402..282199ee7 100644 --- a/code/nel/src/gui/interface_link.cpp +++ b/code/nel/src/gui/interface_link.cpp @@ -165,6 +165,7 @@ namespace NLGUI _NextTriggeredLink[0] = _NextTriggeredLink[1] = NULL; _Triggered[0] = _Triggered[1] = false; _ParseTree = NULL; + _AHCondParsed = NULL; } //=========================================================== @@ -187,10 +188,13 @@ namespace NLGUI _LinkList.erase(_ListEntry); delete _ParseTree; + _ParseTree = NULL; + delete _AHCondParsed; + _AHCondParsed = NULL; } //=========================================================== - bool CInterfaceLink::init(const std::vector &targets, const std::string &expr, const std::string &actionHandler, const std::string &ahParams, const std::string &ahCond, CInterfaceGroup *parentGroup) + bool CInterfaceLink::init(const std::vector &targets, const std::vector &cdbTargets, const std::string &expr, const std::string &actionHandler, const std::string &ahParams, const std::string &ahCond, CInterfaceGroup *parentGroup) { CInterfaceExprValue result; // Build the parse tree @@ -236,6 +240,7 @@ namespace NLGUI // There are no target for this link, so, put in a dedicated list to ensure that the link will be destroyed at exit _LinksWithNoTarget.push_back(TLinkSmartPtr(this)); } + _CDBTargets = cdbTargets; // create observers createObservers(_ObservedNodes); @@ -243,7 +248,12 @@ namespace NLGUI // _ActionHandler = actionHandler; _AHParams = ahParams; + nlassert(!_AHCondParsed); _AHCond = ahCond; + if (!ahCond.empty()) + { + _AHCondParsed = CInterfaceExpr::buildExprTree(ahCond); + } _AHParent = parentGroup; return true; } @@ -356,19 +366,47 @@ namespace NLGUI } } } + if (_CDBTargets.size()) + { + CInterfaceExprValue resultCopy = result; + if (resultCopy.toInteger()) + { + sint64 resultValue = resultCopy.getInteger(); + for (uint k = 0; k < _CDBTargets.size(); ++k) + { + NLMISC::CCDBNodeLeaf *node = _CDBTargets[k].Leaf; + if (!node) + { + node = _CDBTargets[k].Leaf = NLGUI::CDBManager::getInstance()->getDbProp(_CDBTargets[k].LeafName, false); + } + if (node) + { + // assuming setvalue64 always works + node->setValue64(resultValue); + } + else + { + nlwarning("CInterfaceLink::update: Node does not exist: '%s'", _CDBTargets[k].LeafName.c_str()); + } + } + } + else + { + nlwarning("CInterfaceLink::update: Result conversion to db target failed"); + } + } // if there's an action handler, execute it if (!_ActionHandler.empty()) { // If there is a condition, test it. - bool launch= true; - if(!_AHCond.empty()) + bool launch = _AHCond.empty(); + if (_AHCondParsed) // todo: maybe makes more sense to make condition also cover target { - launch= false; - CInterfaceExprValue result; - if(CInterfaceExpr::eval(_AHCond, result)) - launch= result.getBool(); + CInterfaceExprValue result; + _AHCondParsed->eval(result); + launch = result.getBool(); } - if(launch) + if (launch) { CAHManager::getInstance()->runActionHandler(_ActionHandler, _AHParent, _AHParams); // do not add any code after this line because this can be deleted !!!! @@ -517,6 +555,11 @@ namespace NLGUI continue; } std::string::size_type lastPos = targetNames[k].find_last_not_of(" "); + if (startPos >= lastPos) + { + nlwarning(" empty target encountered"); + continue; + } if (!splitLinkTarget(targetNames[k].substr(startPos, lastPos - startPos+1), parentGroup, ti.PropertyName, ti.Elem)) { @@ -531,6 +574,70 @@ namespace NLGUI } + // *************************************************************************** + bool CInterfaceLink::splitLinkTargetsExt(const std::string &targets, CInterfaceGroup *parentGroup,std::vector &targetsVect, std::vector &cdbTargetsVect) + { + std::vector targetNames; + NLMISC::splitString(targets, ",", targetNames); + targetsVect.clear(); + targetsVect.reserve(targetNames.size()); + cdbTargetsVect.clear(); // no reserve because less used + bool everythingOk = true; + for (uint k = 0; k < targetNames.size(); ++k) + { + std::string::size_type startPos = targetNames[k].find_first_not_of(" "); + if(startPos == std::string::npos) + { + // todo hulud interface syntax error + nlwarning(" empty target encountered"); + continue; + } + std::string::size_type lastPos = targetNames[k].find_last_not_of(" "); + if (startPos >= (lastPos+1)) + { + nlwarning(" empty target encountered"); + continue; + } + + if (targetNames[k][startPos] == '@') + { + CInterfaceLink::CCDBTargetInfo ti; + ti.LeafName = targetNames[k].substr((startPos+1), (lastPos+1) - (startPos+1)); + // Do not allow Write on SERVER: or LOCAL: + static const std::string dbServer= "SERVER:"; + static const std::string dbLocal= "LOCAL:"; + static const std::string dbLocalR2= "LOCAL:R2"; + if( (0==ti.LeafName.compare(0, dbServer.size(), dbServer)) || + (0==ti.LeafName.compare(0, dbLocal.size(), dbLocal)) + ) + { + if (0!=ti.LeafName.compare(0, dbLocalR2.size(), dbLocalR2)) + { + //nlwarning("You are not allowed to write on 'SERVER:...' or 'LOCAL:...' database"); + nlstop; + return false; + } + } + ti.Leaf = NLGUI::CDBManager::getInstance()->getDbProp(ti.LeafName, false); + cdbTargetsVect.push_back(ti); + } + else + { + CInterfaceLink::CTargetInfo ti; + if (!splitLinkTarget(targetNames[k].substr(startPos, lastPos - startPos+1), parentGroup, ti.PropertyName, ti.Elem)) + { + // todo hulud interface syntax error + nlwarning(" Can't get link target"); + everythingOk = false; + continue; + } + targetsVect.push_back(ti); + } + } + return everythingOk; + } + + //=========================================================== void CInterfaceLink::checkNbRefs() { diff --git a/code/nel/src/gui/interface_parser.cpp b/code/nel/src/gui/interface_parser.cpp index 76f5df1ed..da8bd1e52 100644 --- a/code/nel/src/gui/interface_parser.cpp +++ b/code/nel/src/gui/interface_parser.cpp @@ -997,6 +997,7 @@ namespace NLGUI std::vector targets; + std::vector cdbTargets; ptr = (char*) xmlGetProp (cur, (xmlChar*)"target"); std::string target; @@ -1004,7 +1005,7 @@ namespace NLGUI { target = std::string( (const char*)ptr ); if( !editorMode ) - CInterfaceLink::splitLinkTargets(std::string((const char*)ptr), parentGroup, targets); + CInterfaceLink::splitLinkTargetsExt(std::string((const char*)ptr), parentGroup, targets, cdbTargets); } // optional action handler @@ -1022,7 +1023,7 @@ namespace NLGUI if( !editorMode ) { CInterfaceLink *il = new CInterfaceLink; - il->init(targets, expr, action, params, cond, parentGroup); // init will add 'il' in the list of link present in 'elm' + il->init(targets, cdbTargets, expr, action, params, cond, parentGroup); // init will add 'il' in the list of link present in 'elm' } else { diff --git a/code/nel/src/gui/link_hack.cpp b/code/nel/src/gui/link_hack.cpp index 7bc058891..1492012e1 100644 --- a/code/nel/src/gui/link_hack.cpp +++ b/code/nel/src/gui/link_hack.cpp @@ -24,6 +24,8 @@ namespace NLGUI { void ifexprufct_forcelink(); + void force_link_dbgroup_select_number_cpp(); + void force_link_dbgroup_combo_box_cpp(); /// Necessary so the linker doesn't drop the code of these classes from the library void LinkHack() @@ -33,5 +35,7 @@ namespace NLGUI CDBViewQuantity::forceLink(); CViewPointer::forceLink(); ifexprufct_forcelink(); + force_link_dbgroup_select_number_cpp(); + force_link_dbgroup_combo_box_cpp(); } } \ No newline at end of file diff --git a/code/nel/src/gui/lua_helper.cpp b/code/nel/src/gui/lua_helper.cpp index bc800725b..fb9466b36 100644 --- a/code/nel/src/gui/lua_helper.cpp +++ b/code/nel/src/gui/lua_helper.cpp @@ -197,6 +197,8 @@ namespace NLGUI { #ifdef LUA_NEVRAX_VERSION _State = lua_open(l_realloc_func, l_free_func); + #elif defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501 + _State = luaL_newstate(); #else _State = lua_open(); #endif @@ -361,7 +363,11 @@ namespace NLGUI rd.Str = &code; rd.Done = false; - int result = lua_load(_State, CHelper::luaChunkReaderFromString, (void *) &rd, dbgSrc.c_str()); + int result = lua_load(_State, CHelper::luaChunkReaderFromString, (void *) &rd, dbgSrc.c_str() +#if LUA_VERSION_NUM >= 502 + , NULL +#endif + ); if (result !=0) { // pop the error code @@ -569,9 +575,17 @@ namespace NLGUI //H_AUTO(Lua_CLuaState_registerFunc) nlassert(function); CLuaStackChecker lsc(this); +#if LUA_VERSION_NUM >= 502 + pushGlobalTable(); +#endif push(name); push(function); +#if LUA_VERSION_NUM >= 502 + setTable(-3); // -3 is the pushGlobalTable + pop(1); // pop the pushGlobalTable value (setTable popped the 2 pushes) +#else setTable(LUA_GLOBALSINDEX); +#endif } @@ -643,13 +657,31 @@ namespace NLGUI } // *************************************************************************** - int CLuaState::pcallByName(const char *functionName, int nargs, int nresults, int funcTableIndex /*=LUA_GLOBALSINDEX*/, int errfunc /*= 0*/) + int CLuaState::pcallByNameGlobal(const char *functionName, int nargs, int nresults, int errfunc /*= 0*/) + { + int initialStackSize = getTop(); + nlassert(functionName); +#if LUA_VERSION_NUM >= 502 + pushGlobalTable(); +#else + nlassert(isTable(LUA_GLOBALSINDEX)); + pushValue(LUA_GLOBALSINDEX); +#endif + return pcallByNameInternal(functionName, nargs, nresults, errfunc, initialStackSize); + } + + int CLuaState::pcallByName(const char *functionName, int nargs, int nresults, int funcTableIndex, int errfunc /*= 0*/) { - //H_AUTO(Lua_CLuaState_pcallByName) int initialStackSize = getTop(); nlassert(functionName); nlassert(isTable(funcTableIndex)); pushValue(funcTableIndex); + return pcallByNameInternal(functionName, nargs, nresults, errfunc, initialStackSize); + } + + int CLuaState::pcallByNameInternal(const char *functionName, int nargs, int nresults, int errfunc /*= 0*/, int initialStackSize) + { + //H_AUTO(Lua_CLuaState_pcallByName) push(functionName); getTable(-2); remove(-2); // get rid of the table @@ -782,7 +814,12 @@ namespace NLGUI int CLuaState::getGCCount() { //H_AUTO(Lua_CLuaState_getGCCount) +#if LUA_VERSION_NUM >= 502 + // deprecated + return 0; +#else return lua_getgccount(_State); +#endif } //================================================================================ diff --git a/code/nel/src/gui/lua_object.cpp b/code/nel/src/gui/lua_object.cpp index a7bbbb7f8..3f8924517 100644 --- a/code/nel/src/gui/lua_object.cpp +++ b/code/nel/src/gui/lua_object.cpp @@ -474,7 +474,11 @@ namespace NLGUI CLuaState *luaState = table.getLuaState(); CLuaStackChecker lsc(luaState); // get pointer to the 'next' function +#if LUA_VERSION_NUM >= 502 + luaState->pushGlobalTable(); +#else luaState->pushValue(LUA_GLOBALSINDEX); +#endif _NextFunction = CLuaObject(*luaState)["next"]; // nlassert(luaState); diff --git a/code/nel/src/gui/widget_manager.cpp b/code/nel/src/gui/widget_manager.cpp index 22839a8cf..4d7ada23d 100644 --- a/code/nel/src/gui/widget_manager.cpp +++ b/code/nel/src/gui/widget_manager.cpp @@ -1035,8 +1035,8 @@ namespace NLGUI setCapturePointerRight(NULL); resetColorProps(); - - _AlphaRolloverSpeedDB = NULL; + resetAlphaRolloverSpeedProps(); + resetGlobalAlphasProps(); activeAnims.clear(); } @@ -1967,10 +1967,18 @@ namespace NLGUI } // Update global color from database - setGlobalColor( NLMISC::CRGBA ( (uint8)CDBManager::getInstance()->getDbProp("UI:SAVE:COLOR:R")->getValue32(), - (uint8)CDBManager::getInstance()->getDbProp("UI:SAVE:COLOR:G")->getValue32(), - (uint8)CDBManager::getInstance()->getDbProp("UI:SAVE:COLOR:B")->getValue32(), - (uint8)CDBManager::getInstance()->getDbProp("UI:SAVE:COLOR:A")->getValue32() ) ); + if (!_RProp) + { + _RProp = CDBManager::getInstance()->getDbProp("UI:SAVE:COLOR:R"); + _GProp = CDBManager::getInstance()->getDbProp("UI:SAVE:COLOR:G"); + _BProp = CDBManager::getInstance()->getDbProp("UI:SAVE:COLOR:B"); + _AProp = CDBManager::getInstance()->getDbProp("UI:SAVE:COLOR:A"); + } + setGlobalColor(NLMISC::CRGBA( + (uint8)_RProp->getValue32(), + (uint8)_GProp->getValue32(), + (uint8)_BProp->getValue32(), + (uint8)_AProp->getValue32())); NLMISC::CRGBA c = getGlobalColorForContent(); NLMISC::CRGBA gc = getGlobalColor(); @@ -2965,7 +2973,7 @@ namespace NLGUI return fTmp*fTmp*fTmp; } - void CWidgetManager::resetAlphaRolloverSpeed() + void CWidgetManager::resetAlphaRolloverSpeedProps() { _AlphaRolloverSpeedDB = NULL; } @@ -2981,10 +2989,29 @@ namespace NLGUI void CWidgetManager::updateGlobalAlphas() { - _GlobalContentAlpha = (uint8)CDBManager::getInstance()->getDbProp("UI:SAVE:CONTENT_ALPHA")->getValue32(); - _GlobalContainerAlpha = (uint8)CDBManager::getInstance()->getDbProp("UI:SAVE:CONTAINER_ALPHA")->getValue32(); - _GlobalRolloverFactorContent = (uint8)CDBManager::getInstance()->getDbProp("UI:SAVE:CONTENT_ROLLOVER_FACTOR")->getValue32(); - _GlobalRolloverFactorContainer = (uint8)CDBManager::getInstance()->getDbProp("UI:SAVE:CONTAINER_ROLLOVER_FACTOR")->getValue32(); + if (!_GlobalContentAlphaDB) + { + _GlobalContentAlphaDB = CDBManager::getInstance()->getDbProp("UI:SAVE:CONTENT_ALPHA"); + nlassert(_GlobalContentAlphaDB); + _GlobalContainerAlphaDB = CDBManager::getInstance()->getDbProp("UI:SAVE:CONTAINER_ALPHA"); + nlassert(_GlobalContainerAlphaDB); + _GlobalContentRolloverFactorDB = CDBManager::getInstance()->getDbProp("UI:SAVE:CONTENT_ROLLOVER_FACTOR"); + nlassert(_GlobalContentRolloverFactorDB); + _GlobalContainerRolloverFactorDB = CDBManager::getInstance()->getDbProp("UI:SAVE:CONTAINER_ROLLOVER_FACTOR"); + nlassert(_GlobalContainerRolloverFactorDB); + } + _GlobalContentAlpha = (uint8)_GlobalContentAlphaDB->getValue32(); + _GlobalContainerAlpha = (uint8)_GlobalContainerAlphaDB->getValue32(); + _GlobalRolloverFactorContent = (uint8)_GlobalContentRolloverFactorDB->getValue32(); + _GlobalRolloverFactorContainer = (uint8)_GlobalContainerRolloverFactorDB->getValue32(); + } + + void CWidgetManager::resetGlobalAlphasProps() + { + _GlobalContentAlphaDB = NULL; + _GlobalContainerAlphaDB = NULL; + _GlobalContentRolloverFactorDB = NULL; + _GlobalContainerRolloverFactorDB = NULL; } void CWidgetManager::registerNewScreenSizeHandler( INewScreenSizeHandler *handler ) @@ -3156,6 +3183,7 @@ namespace NLGUI CWidgetManager::CWidgetManager() { + LinkHack(); CStringShared::createStringMapper(); CReflectableRegister::registerClasses(); @@ -3171,6 +3199,8 @@ namespace NLGUI _LastYContextHelp= -10000; resetColorProps(); + resetAlphaRolloverSpeedProps(); + resetGlobalAlphasProps(); _GlobalColor = NLMISC::CRGBA(255,255,255,255); _GlobalColorForContent = _GlobalColor; diff --git a/code/nel/tools/3d/CMakeLists.txt b/code/nel/tools/3d/CMakeLists.txt index 58360aec0..441a83800 100644 --- a/code/nel/tools/3d/CMakeLists.txt +++ b/code/nel/tools/3d/CMakeLists.txt @@ -1,61 +1,75 @@ -SUBDIRS( - build_coarse_mesh - build_far_bank - build_smallbank - ig_lighter - zone_dependencies - zone_ig_lighter - zone_lighter - zone_welder - animation_set_builder - anim_builder - build_clod_bank - build_clodtex - build_interface - build_shadow_skin - cluster_viewer - file_info - get_neighbors - ig_add - ig_info - shapes_exporter - tga_cut - tga_resize - zone_check_bind - zone_dump - zviewer) -IF(WIN32) - ADD_SUBDIRECTORY(ig_elevation) - ADD_SUBDIRECTORY(lightmap_optimizer) +IF(WITH_NEL_TOOLS) + SUBDIRS( + build_coarse_mesh + build_far_bank + build_smallbank + ig_lighter + zone_dependencies + zone_ig_lighter + zone_lighter + zone_welder + animation_set_builder + anim_builder + build_clod_bank + build_clodtex + build_interface + build_shadow_skin + cluster_viewer + file_info + get_neighbors + ig_add + ig_info + shapes_exporter + tga_cut + tga_resize + shape2obj + zone_check_bind + zone_dump + zviewer) + +ENDIF(WITH_NEL_TOOLS) + +# For tools selection of only max plugins +IF(WIN32) IF(MFC_FOUND) ADD_SUBDIRECTORY(object_viewer) - ADD_SUBDIRECTORY(object_viewer_exe) - ADD_SUBDIRECTORY(tile_edit) + IF(WITH_NEL_MAXPLUGIN) + IF(MAXSDK_FOUND) + ADD_SUBDIRECTORY(plugin_max) + ADD_SUBDIRECTORY(ligo) + ENDIF(MAXSDK_FOUND) + ENDIF(WITH_NEL_MAXPLUGIN) ENDIF(MFC_FOUND) - - IF(WITH_NEL_MAXPLUGIN) - IF(MAXSDK_FOUND) - ADD_SUBDIRECTORY(plugin_max) - ADD_SUBDIRECTORY(ligo) - ENDIF(MAXSDK_FOUND) - ENDIF(WITH_NEL_MAXPLUGIN) - ENDIF(WIN32) -IF(WITH_QT) - ADD_SUBDIRECTORY(tile_edit_qt) - ADD_SUBDIRECTORY(object_viewer_qt) - ADD_SUBDIRECTORY(object_viewer_widget) -ENDIF(WITH_QT) +IF(WITH_NEL_TOOLS) -IF(SQUISH_FOUND) + IF(WIN32) + ADD_SUBDIRECTORY(ig_elevation) + ADD_SUBDIRECTORY(lightmap_optimizer) + IF(MFC_FOUND) + ADD_SUBDIRECTORY(object_viewer_exe) + ADD_SUBDIRECTORY(tile_edit) + ENDIF(MFC_FOUND) + ENDIF(WIN32) + + IF(WITH_QT) + ADD_SUBDIRECTORY(tile_edit_qt) + ADD_SUBDIRECTORY(object_viewer_qt) + ADD_SUBDIRECTORY(object_viewer_widget) + ENDIF(WITH_QT) + + IF(SQUISH_FOUND) ADD_SUBDIRECTORY(s3tc_compressor_lib) - ADD_SUBDIRECTORY(panoply_maker) - ADD_SUBDIRECTORY(tga_2_dds) - ADD_SUBDIRECTORY(hls_bank_maker) -ENDIF(SQUISH_FOUND) + ADD_SUBDIRECTORY(panoply_maker) + ADD_SUBDIRECTORY(tga_2_dds) + ADD_SUBDIRECTORY(hls_bank_maker) + ENDIF(SQUISH_FOUND) + + #crash_log_analyser + #shapes_exporter + +ENDIF(WITH_NEL_TOOLS) -#crash_log_analyser -#shapes_exporter diff --git a/code/nel/tools/3d/object_viewer/object_viewer.cpp b/code/nel/tools/3d/object_viewer/object_viewer.cpp index 19490309b..bc9949079 100644 --- a/code/nel/tools/3d/object_viewer/object_viewer.cpp +++ b/code/nel/tools/3d/object_viewer/object_viewer.cpp @@ -1271,7 +1271,8 @@ void CObjectViewer::go () // Calc FPS static sint64 lastTime=NLMISC::CTime::getPerformanceTime (); sint64 newTime=NLMISC::CTime::getPerformanceTime (); - float fps = (float)(1.0 / NLMISC::CTime::ticksToSecond (newTime-lastTime)); + sint64 timeDiff = newTime - lastTime; + float fps = timeDiff > 0 ? (float)(1.0 / NLMISC::CTime::ticksToSecond (newTime-lastTime)) : 1000.0f; lastTime=newTime; char msgBar[1024]; uint nbPlayingSources, nbSources; diff --git a/code/nel/tools/3d/object_viewer_qt/src/images/nel_ide_load.png b/code/nel/tools/3d/object_viewer_qt/src/images/nel_ide_load.png index 217259d0467a6d95f04b921e9157a3cc2e3a990b..1ec9d823ff81a9644135871393fec9f49dab11ed 100644 GIT binary patch literal 137855 zcmXt<2RPMl*vFALwjzmRj~ts$lD$LbF|t?4I#%|~E;Dqb?ajHs0V-&g;=)pTCo0gz_D@gG)vk+xcs$d||NYoW^WtLZh99TyzZY&! z!58BdPSVX6w*4RQF}Z>X>@i$jd@pZ3q)76qWMVxpHF2rEnVDHuX@z~3jp5;0fFLb< z>&F>~!?XFr&bSNvW}^k?7Z5i;zjgy&_qH5td-whe?o^GkWHEJ^P0?h=m~HodmCMiF zlil6j^V^AtpnrcX#d5#dK2o15PRS~@X`Bm?l7^B$R(BN1j*tsMEzHl?5yDE4m=>fa zXL52f)%c-pMJNA-~y4+!X%*n%R?oXFa$G?5MzUa9zMtcsqWsUuI z70prO99>61EVFDo7P{NpxoKkBYtlz;mQGF4W9#nP)LZR&W45N~T#Yh^KcxF7C;AZW z3f+IUZ6*#`zc0F1MZvF5AH5ed7}O&Wu618lwF2u`g2>b;v!wm2-es1r#%W3G+>sr> znvm^`}vDQ|d`Km3brn1 zFCl2wHWbTg?>#=}Z9^gRlPi`k?sJ)DzJ{h|3;__fb zoAUhp{HI%vASv!$mI3!RxH^?gduL}8FSaZ{Xk_D1?rnB<_L@r(7jdWsoDRG%zb;1n zKKC{gUYf=^-e}g*2I0)uRngT0T2Tpc@mnuTr(iN>)%p>Xc^fkh&0Nvksl?3OB}akM zq^MzQ))HQtm^KsVp<9x4aWdU%oQ)>@F@vmSRQP=!V%2D@MaEC5_|>xjGw#&$tL~KV zf}|)xuMhXrZ3Jm!hh9#>pO+x073JQlaq85f@5e;oF?wOJ$I}$gOTJqRtB_?>-H%+^ z@42aY&znDrhJ-S^n!bP}j&C3_{OP0G)Q{=nf_lukr~{VvkNt9Xtc5G| zt5k|5($2c`N7v)KF-6&&;g>Iq(haJM9jIV-_7@>z|*J3;uk4(s8TK zt0VX4pjEvxveG^a+wQ=4$u?KeeZSQHr?s$~skbN;e1;ed#

Ipmp4ZBtlLkd(2uG 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 OKY3{tsd5SU=l=r;@S|k_ literal 45864 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�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 diff --git a/code/nel/tools/3d/plugin_max/scripts/startup/nel_material.ms b/code/nel/tools/3d/plugin_max/scripts/startup/nel_material.ms index 02f07dfe6..06021c45f 100644 --- a/code/nel/tools/3d/plugin_max/scripts/startup/nel_material.ms +++ b/code/nel/tools/3d/plugin_max/scripts/startup/nel_material.ms @@ -574,36 +574,6 @@ plugin material NelMaterial CheckBox cbUseSelfIllumColor "Use Color" checked:false align:#right ) - on cbTwoSided changed bval do - updateUI false - - on cpAmbient changed cval do - updateUI false - - on cpDiffuse changed cval do - updateUI false - - on spOpacity changed pval do - updateUI false - - on cpSpecular changed cval do - updateUI false - - on spSpecularLevel changed pval do - updateUI false - - on spGlossiness changed pval do - updateUI false - - on cpSelfIllumColor changed cval do - updateUI false - - on spSelfIllumAmount changed bval do - updateUI false - - on cbUseSelfIllumColor changed bval do - updateUI false - Fn updateUI update = ( if (version >= 14) then @@ -655,6 +625,36 @@ plugin material NelMaterial ) ) + on cbTwoSided changed bval do + updateUI false + + on cpAmbient changed cval do + updateUI false + + on cpDiffuse changed cval do + updateUI false + + on spOpacity changed pval do + updateUI false + + on cpSpecular changed cval do + updateUI false + + on spSpecularLevel changed pval do + updateUI false + + on spGlossiness changed pval do + updateUI false + + on cpSelfIllumColor changed cval do + updateUI false + + on spSelfIllumAmount changed bval do + updateUI false + + on cbUseSelfIllumColor changed bval do + updateUI false + on nelBasicParameters open do ( updateUI true diff --git a/code/nel/tools/3d/shape2obj/CMakeLists.txt b/code/nel/tools/3d/shape2obj/CMakeLists.txt new file mode 100644 index 000000000..c6fb25ec7 --- /dev/null +++ b/code/nel/tools/3d/shape2obj/CMakeLists.txt @@ -0,0 +1,9 @@ +FILE(GLOB SRC *.cpp) + +ADD_EXECUTABLE(shape2obj ${SRC}) + +TARGET_LINK_LIBRARIES(shape2obj nelmisc nel3d) +NL_DEFAULT_PROPS(shape2obj "NeL, Tools, 3D: shape2obj") +NL_ADD_RUNTIME_FLAGS(shape2obj) + +INSTALL(TARGETS shape2obj RUNTIME DESTINATION ${NL_BIN_PREFIX} COMPONENT tools3d) diff --git a/code/nel/tools/3d/shape2obj/main.cpp b/code/nel/tools/3d/shape2obj/main.cpp index 91945bdb6..66d9dd6c4 100644 --- a/code/nel/tools/3d/shape2obj/main.cpp +++ b/code/nel/tools/3d/shape2obj/main.cpp @@ -66,7 +66,7 @@ const CIndexBuffer *getRdrPassPrimitiveBlock(const CMeshMRMSkinnedGeom *mesh, ui bool ProcessMeshMRMSkinned(const std::string &filename, IShape *shapeMesh); bool ProcessMeshMRM(const std::string &filename, IShape *shapeMesh); -bool ProcessMesh(const std::string &filename, IShape *shapeMesh); +//bool ProcessMesh(const std::string &filename, IShape *shapeMesh); int main(int argc, char* argv[]) { @@ -110,7 +110,7 @@ int main(int argc, char* argv[]) if (ProcessMeshMRMSkinned(filename, shapeMesh)) return 0; if (ProcessMeshMRM(filename, shapeMesh)) return 0; - if (ProcessMesh(filename, shapeMesh)) return 0; +// if (ProcessMesh(filename, shapeMesh)) return 0; return 0; } @@ -519,6 +519,10 @@ bool ProcessMeshMRM(const std::string &filename, IShape *shapeMesh) return true; } +/* + +TODO: implement this + bool ProcessMesh(const std::string &filename, IShape *shapeMesh) { CMesh *mesh = dynamic_cast(shapeMesh); @@ -666,3 +670,5 @@ bool ProcessMesh(const std::string &filename, IShape *shapeMesh) return true; } + +*/ \ No newline at end of file diff --git a/code/nel/tools/CMakeLists.txt b/code/nel/tools/CMakeLists.txt index 49a8abef4..abc5dff02 100644 --- a/code/nel/tools/CMakeLists.txt +++ b/code/nel/tools/CMakeLists.txt @@ -1,28 +1,34 @@ -ADD_SUBDIRECTORY(misc) -ADD_SUBDIRECTORY(memory) +# Don't add other subdirectories if only max plugins are selected. +IF(WITH_NEL_TOOLS) + ADD_SUBDIRECTORY(misc) + ADD_SUBDIRECTORY(memory) +ENDIF(WITH_NEL_TOOLS) + +# Max plugins are under the 3d directory as well. IF(WITH_3D) ADD_SUBDIRECTORY(3d) ENDIF(WITH_3D) -IF(WITH_PACS) - ADD_SUBDIRECTORY(pacs) -ENDIF(WITH_PACS) - -IF(WITH_LOGIC) - ADD_SUBDIRECTORY(logic) -ENDIF(WITH_LOGIC) - -IF(WITH_GEORGES) - ADD_SUBDIRECTORY(georges) -ENDIF(WITH_GEORGES) - -IF(WITH_SOUND) - ADD_SUBDIRECTORY(sound) -ENDIF(WITH_SOUND) - -IF(WITH_NEL_TESTS) - ADD_SUBDIRECTORY(nel_unit_test) -ENDIF(WITH_NEL_TESTS) - -#build_gamedata +# Don't add other subdirectories if only max plugins are selected. +IF(WITH_NEL_TOOLS) + IF(WITH_PACS) + ADD_SUBDIRECTORY(pacs) + ENDIF(WITH_PACS) + + IF(WITH_LOGIC) + ADD_SUBDIRECTORY(logic) + ENDIF(WITH_LOGIC) + + IF(WITH_GEORGES) + ADD_SUBDIRECTORY(georges) + ENDIF(WITH_GEORGES) + + IF(WITH_SOUND) + ADD_SUBDIRECTORY(sound) + ENDIF(WITH_SOUND) + + IF(WITH_NEL_TESTS) + ADD_SUBDIRECTORY(nel_unit_test) + ENDIF(WITH_NEL_TESTS) +ENDIF(WITH_NEL_TOOLS) diff --git a/code/nel/tools/build_gamedata/generators/generate_simple_max_exporters.py b/code/nel/tools/build_gamedata/generators/generate_simple_max_exporters.py index f034c5d19..cd8a9039f 100644 --- a/code/nel/tools/build_gamedata/generators/generate_simple_max_exporters.py +++ b/code/nel/tools/build_gamedata/generators/generate_simple_max_exporters.py @@ -88,8 +88,6 @@ def generateSimpleMaxExporter(processName, fileExtension, sourceDirectoriesVaria -generateSimpleMaxExporter("pacs_prim", "pacs_prim", "PacsPrimSourceDirectories", "PacsPrimExportDirectory", "PacsPrimInstallDirectory") - generateSimpleMaxExporter("skel", "skel", "SkelSourceDirectories", "SkelExportDirectory", "SkelInstallDirectory") generateSimpleMaxExporter("swt", "swt", "SwtSourceDirectories", "SwtExportDirectory", "SwtInstallDirectory") diff --git a/code/nel/tools/build_gamedata/generators/generate_tagged_max_exporters.py b/code/nel/tools/build_gamedata/generators/generate_tagged_max_exporters.py index e10a23cea..89a65d3fb 100644 --- a/code/nel/tools/build_gamedata/generators/generate_tagged_max_exporters.py +++ b/code/nel/tools/build_gamedata/generators/generate_tagged_max_exporters.py @@ -100,6 +100,8 @@ def generateTaggedMaxExporter(processName, fileExtension, sourceDirectoriesVaria +generateTaggedMaxExporter("pacs_prim", "pacs_prim", "PacsPrimSourceDirectories", "PacsPrimExportDirectory", "PacsPrimTagExportDirectory", "PacsPrimInstallDirectory") + generateTaggedMaxExporter("clodbank", "clod", "ClodSourceDirectories", "ClodExportDirectory", "ClodTagExportDirectory", "ClodInstallDirectory") generateTaggedMaxScript("ig", "ig") diff --git a/code/nel/tools/build_gamedata/processes/pacs_prim/1_export.py b/code/nel/tools/build_gamedata/processes/pacs_prim/1_export.py index b793fe0f8..f551228c0 100644 --- a/code/nel/tools/build_gamedata/processes/pacs_prim/1_export.py +++ b/code/nel/tools/build_gamedata/processes/pacs_prim/1_export.py @@ -6,7 +6,7 @@ # # \file 1_export.py # \brief Export pacs_prim -# \date 2011-09-28-07-42-GMT +# \date 2013-07-24-14-21-GMT # \author Jan Boon (Kaetemi) # Python port of game data build pipeline. # Export pacs_prim @@ -33,7 +33,9 @@ sys.path.append("../../configuration") if os.path.isfile("log.log"): os.remove("log.log") -log = open("log.log", "w") +if os.path.isfile("temp_log.log"): + os.remove("temp_log.log") +log = open("temp_log.log", "w") from scripts import * from buildsite import * from process import * @@ -47,6 +49,7 @@ printLog(log, "-------") printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, "") + # Find tools # ... @@ -58,15 +61,18 @@ if MaxAvailable: printLog(log, ">>> Export pacs_prim 3dsmax <<<") mkPath(log, ExportBuildDirectory + "/" + PacsPrimExportDirectory) + mkPath(log, ExportBuildDirectory + "/" + PacsPrimTagExportDirectory) for dir in PacsPrimSourceDirectories: mkPath(log, DatabaseDirectory + "/" + dir) - if (needUpdateDirByTagLog(log, DatabaseDirectory + "/" + dir, ".max", ExportBuildDirectory + "/" + PacsPrimExportDirectory, ".pacs_prim")): + if (needUpdateDirByTagLog(log, DatabaseDirectory + "/" + dir, ".max", ExportBuildDirectory + "/" + PacsPrimTagExportDirectory, ".max.tag")): scriptSrc = "maxscript/pacs_prim_export.ms" scriptDst = MaxUserDirectory + "/scripts/pacs_prim_export.ms" outputLogfile = ScriptDirectory + "/processes/pacs_prim/log.log" outputDirectory = ExportBuildDirectory + "/" + PacsPrimExportDirectory + tagDirectory = ExportBuildDirectory + "/" + PacsPrimTagExportDirectory maxSourceDir = DatabaseDirectory + "/" + dir - tagList = findFiles(log, outputDirectory, "", ".pacs_prim") + maxRunningTagFile = tagDirectory + "/max_running.tag" + tagList = findFiles(log, tagDirectory, "", ".max.tag") tagLen = len(tagList) if os.path.isfile(scriptDst): os.remove(scriptDst) @@ -77,18 +83,50 @@ if MaxAvailable: newline = line.replace("%OutputLogfile%", outputLogfile) newline = newline.replace("%MaxSourceDirectory%", maxSourceDir) newline = newline.replace("%OutputDirectory%", outputDirectory) + newline = newline.replace("%TagDirectory%", tagDirectory) sDst.write(newline) sSrc.close() sDst.close() + zeroRetryLimit = 3 while tagDiff > 0: + mrt = open(maxRunningTagFile, "w") + mrt.write("moe-moe-kyun") + mrt.close() printLog(log, "MAXSCRIPT " + scriptDst) subprocess.call([ Max, "-U", "MAXScript", "pacs_prim_export.ms", "-q", "-mi", "-vn" ]) - tagList = findFiles(log, outputDirectory, "", ".pacs_prim") + if os.path.exists(outputLogfile): + try: + lSrc = open(outputLogfile, "r") + for line in lSrc: + lineStrip = line.strip() + if (len(lineStrip) > 0): + printLog(log, lineStrip) + lSrc.close() + os.remove(outputLogfile) + except Exception: + printLog(log, "ERROR Failed to read 3dsmax log") + else: + printLog(log, "WARNING No 3dsmax log") + tagList = findFiles(log, tagDirectory, "", ".max.tag") newTagLen = len(tagList) tagDiff = newTagLen - tagLen tagLen = newTagLen - printLog(log, "Exported " + str(tagDiff) + " .pacs_prim files!") + addTagDiff = 0 + if os.path.exists(maxRunningTagFile): + printLog(log, "FAIL 3ds Max crashed and/or file export failed!") + if tagDiff == 0: + if zeroRetryLimit > 0: + zeroRetryLimit = zeroRetryLimit - 1 + addTagDiff = 1 + else: + printLog(log, "FAIL Retry limit reached!") + else: + addTagDiff = 1 + os.remove(maxRunningTagFile) + printLog(log, "Exported " + str(tagDiff) + " .max files!") + tagDiff += addTagDiff os.remove(scriptDst) + printLog(log, "") @@ -99,8 +137,10 @@ if os.path.isfile(listPath): -printLog(log, "") log.close() +if os.path.isfile("log.log"): + os.remove("log.log") +shutil.move("temp_log.log", "log.log") # end of file diff --git a/code/nel/tools/build_gamedata/processes/pacs_prim/maxscript/pacs_prim_export.ms b/code/nel/tools/build_gamedata/processes/pacs_prim/maxscript/pacs_prim_export.ms index 21bdcdd4c..ddfc0014a 100644 --- a/code/nel/tools/build_gamedata/processes/pacs_prim/maxscript/pacs_prim_export.ms +++ b/code/nel/tools/build_gamedata/processes/pacs_prim/maxscript/pacs_prim_export.ms @@ -8,6 +8,9 @@ -- Allocate 20 Me for the script heapSize += 15000000 +-- In case of error just abort the app and don't show nel report window +NelForceQuitOnMsgDisplayer() + nlErrorFilename = "%OutputLogfile%" nlErrorStream = openFile nlErrorFilename mode:"a" if nlErrorStream == undefined then @@ -110,75 +113,128 @@ fn runNelMaxExport inputMaxFile = +removeRunningTag = true + try ( - -- Get files in the %MaxSourceDirectory% directory - files = getFiles "%MaxSourceDirectory%/*.max" - gc() - - -- Sort files - sort files - gc() - - -- No file ? - if files.count != 0 then + undo off ( - -- For each files - for i = 1 to files.count do + -- Get files in the %MaxSourceDirectory% directory + files = getFiles "%MaxSourceDirectory%/*.max" + gc() + + -- Sort files + sort files + gc() + + -- No file ? + if files.count != 0 then ( - inputMaxFile = files[i] - outputNelFile = ("%OutputDirectory%/" + (getFilenameFile inputMaxFile) + ".pacs_prim") - - try + -- For each files + for i = 1 to files.count do ( - -- Compare file date - if (NeLTestFileDate outputNelFile inputMaxFile) == true then - ( - -- Free memory and file handles - gc() - heapfree - - -- Reset 3dsmax - resetMAXFile #noprompt - - -- Open the max project - nlerror("Scanning file " + inputMaxFile + " ...") - if (loadMaxFile inputMaxFile quiet:true) == true then + inputMaxFile = files[i] + outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag") + + --try + --( + -- Compare file date + if (NeLTestFileDate outputTagFile inputMaxFile) == true then ( - runNelMaxExport(inputMaxFile) + -- Free memory and file handles + gc() + heapfree + + -- Reset 3dsmax + resetMAXFile #noprompt + + -- Open the max project + nlerror("Scanning file " + inputMaxFile + " ...") + if (loadMaxFile inputMaxFile quiet:true) == true then + ( + tagThisFile = runNelMaxExport(inputMaxFile) + + -- Write a tag file + if tagThisFile == true then + ( + tagFile = createFile outputTagFile + if tagFile == undefined then + ( + nlerror("WARNING can't create tag file " + outputTagFile) + removeRunningTag = false + ) + else + ( + print "mukyu" to: tagFile + close tagFile + ) + ) + else + ( + removeRunningTag = false + ) + ) + else + ( + -- Error + nlerror("ERROR exporting 'pacs_prim': can't open the file " + inputMaxFile) + removeRunningTag = false + ) ) else ( - -- Error - nlerror("ERROR exporting 'pacs_prim': can't open the file " + inputMaxFile) + nlerror("SKIPPED BY TAG " + inputMaxFile) ) - ) - else - ( - nlerror("SKIPPED " + inputMaxFile) - ) - ) - catch - ( - -- Error - nlerror("ERROR error exporting 'pacs_prim' in files " + inputMaxFile) + --) + --catch + --( + -- -- Error + -- nlerror("ERROR error exporting 'pacs_prim' in file " + inputMaxFile) + -- removeRunningTag = false + --) ) ) - ) - else - ( - nlerror("WARNING no *.max file in folder %MaxSourceDirectory%") + else + ( + nlerror("WARNING no *.max file in folder %MaxSourceDirectory%") + ) ) ) catch ( -- Error - nlerror("ERROR fatal error exporting 'pacs_prim' in folder %MaxSourceDirectory%") + nlerror("ERROR Fatal error exporting 'pacs_prim' in folder %MaxSourceDirectory%") + nlerror("FAIL Fatal error occured") + NelForceQuitRightNow() + removeRunningTag = false +) + +try +( + if (removeRunningTag) then + ( + resetMAXFile #noPrompt + ) +) +catch +( + nlerror("FAIL Last reset fails") + removeRunningTag = false +) + +if (removeRunningTag) then +( + nlerror("SUCCESS All .max files have been successfully exported") + deleteFile("%TagDirectory%/max_running.tag") +) +else +( + nlerror("FAIL One or more issues occured") + NelForceQuitRightNow() ) -- Bye - -resetMAXFile #noprompt +nlerror("BYE") quitMAX #noPrompt quitMAX() #noPrompt diff --git a/code/ryzom/CMakeLists.txt b/code/ryzom/CMakeLists.txt index 991437159..95ed56c46 100644 --- a/code/ryzom/CMakeLists.txt +++ b/code/ryzom/CMakeLists.txt @@ -46,6 +46,12 @@ IF(WITH_RYZOM_CLIENT) ENDIF(CURL_STATIC) ADD_SUBDIRECTORY(client) + +ELSEIF(WITH_RYZOM_TOOLS) + + # Need clientsheets lib for sheets packer tool + ADD_SUBDIRECTORY(client) + ENDIF(WITH_RYZOM_CLIENT) IF(WITH_RYZOM_TOOLS) @@ -53,6 +59,14 @@ IF(WITH_RYZOM_TOOLS) ENDIF(WITH_RYZOM_TOOLS) IF(WITH_RYZOM_SERVER) + FIND_PACKAGE(MySQL REQUIRED) ADD_SUBDIRECTORY(server) + +ELSEIF(WITH_RYZOM_TOOLS) + + # Need servershare for build packed collision tool + # Need aishare for build wmap tool + ADD_SUBDIRECTORY(server) + ENDIF(WITH_RYZOM_SERVER) diff --git a/code/ryzom/client/CMakeLists.txt b/code/ryzom/client/CMakeLists.txt index 36090be7b..78cbbbd04 100644 --- a/code/ryzom/client/CMakeLists.txt +++ b/code/ryzom/client/CMakeLists.txt @@ -1,4 +1,9 @@ + +# Need clientsheets lib for sheets packer tool ADD_SUBDIRECTORY(src) + +IF(WITH_RYZOM_CLIENT) + #ADD_SUBDIRECTORY(data) #ADD_SUBDIRECTORY(patcher) @@ -12,3 +17,5 @@ IF(RYZOM_ETC_PREFIX) ELSE(RYZOM_ETC_PREFIX) INSTALL(FILES client_default.cfg DESTINATION etc/ryzom) ENDIF(RYZOM_ETC_PREFIX) + +ENDIF(WITH_RYZOM_CLIENT) diff --git a/code/ryzom/client/client_default.cfg b/code/ryzom/client/client_default.cfg index f95a5c2b6..05c0db137 100644 --- a/code/ryzom/client/client_default.cfg +++ b/code/ryzom/client/client_default.cfg @@ -126,24 +126,24 @@ AutoEquipTool = 1; // *** LANDSCAPE -LandscapeTileNear = 150.000000; -LandscapeTileNear_min = 20.000000; -LandscapeTileNear_max = 250.000000; -LandscapeTileNear_step = 10.0; -LandscapeTileNear_ps0 = 20.0; -LandscapeTileNear_ps1 = 100.0; -LandscapeTileNear_ps2 = 150.0; -LandscapeTileNear_ps3 = 200.0; +LandscapeTileNear = 50.000000; +LandscapeTileNear_min = 20.000000; +LandscapeTileNear_max = 100.000000; +LandscapeTileNear_step = 10.0; +LandscapeTileNear_ps0 = 20.0; +LandscapeTileNear_ps1 = 40.0; +LandscapeTileNear_ps2 = 50.0; +LandscapeTileNear_ps3 = 80.0; // NB: threshold is inverted ULandscape::setThreshold(), to be more intelligible -LandscapeThreshold = 2000.0; -LandscapeThreshold_min = 100.0; // Low quality => 0.01 threshold -LandscapeThreshold_max = 4000.0; // High quality => 0.0005 threshold -LandscapeThreshold_step = 100.0; -LandscapeThreshold_ps0 = 100.0; -LandscapeThreshold_ps1 = 1000.0; -LandscapeThreshold_ps2 = 2000.0; -LandscapeThreshold_ps3 = 3000.0; +LandscapeThreshold = 1000.0; +LandscapeThreshold_min = 100.0; // Low quality => 0.01 threshold +LandscapeThreshold_max = 2000.0; // High quality => 0.0005 threshold +LandscapeThreshold_step = 100.0; +LandscapeThreshold_ps0 = 100.0; +LandscapeThreshold_ps1 = 500.0; +LandscapeThreshold_ps2 = 1000.0; +LandscapeThreshold_ps3 = 2000.0; Vision = 500.000000; Vision_min = 200.000000; diff --git a/code/ryzom/client/client_default.cfg.in b/code/ryzom/client/client_default.cfg.in index 41c3dd1de..030a4a2b2 100644 --- a/code/ryzom/client/client_default.cfg.in +++ b/code/ryzom/client/client_default.cfg.in @@ -126,24 +126,24 @@ AutoEquipTool = 1; // *** LANDSCAPE -LandscapeTileNear = 150.000000; -LandscapeTileNear_min = 20.000000; -LandscapeTileNear_max = 250.000000; -LandscapeTileNear_step = 10.0; -LandscapeTileNear_ps0 = 20.0; -LandscapeTileNear_ps1 = 100.0; -LandscapeTileNear_ps2 = 150.0; -LandscapeTileNear_ps3 = 200.0; +LandscapeTileNear = 50.000000; +LandscapeTileNear_min = 20.000000; +LandscapeTileNear_max = 100.000000; +LandscapeTileNear_step = 10.0; +LandscapeTileNear_ps0 = 20.0; +LandscapeTileNear_ps1 = 40.0; +LandscapeTileNear_ps2 = 50.0; +LandscapeTileNear_ps3 = 80.0; // NB: threshold is inverted ULandscape::setThreshold(), to be more intelligible -LandscapeThreshold = 2000.0; -LandscapeThreshold_min = 100.0; // Low quality => 0.01 threshold -LandscapeThreshold_max = 4000.0; // High quality => 0.0005 threshold -LandscapeThreshold_step = 100.0; -LandscapeThreshold_ps0 = 100.0; -LandscapeThreshold_ps1 = 1000.0; -LandscapeThreshold_ps2 = 2000.0; -LandscapeThreshold_ps3 = 3000.0; +LandscapeThreshold = 1000.0; +LandscapeThreshold_min = 100.0; // Low quality => 0.01 threshold +LandscapeThreshold_max = 2000.0; // High quality => 0.0005 threshold +LandscapeThreshold_step = 100.0; +LandscapeThreshold_ps0 = 100.0; +LandscapeThreshold_ps1 = 500.0; +LandscapeThreshold_ps2 = 1000.0; +LandscapeThreshold_ps3 = 2000.0; Vision = 500.000000; Vision_min = 200.000000; diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua b/code/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua index 686e21b6c..c2569b301 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua +++ b/code/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua @@ -84,7 +84,7 @@ function bgdownloader:setPatchProgress(progress) self:getPrioCB().active = true local progressPercentText = string.format("%d%%", 100 * progress) - local progressPostfix = math.mod(os.time(), 3) + local progressPostfix = math.fmod(os.time(), 3) local progressDate = nltime.getLocalTime() / 500 local colValue = math.floor(230 + 24 * math.sin(progressDate)) local color = string.format("%d %d %d %d", colValue, colValue, colValue, 255) diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/config.xml b/code/ryzom/client/data/gamedev/interfaces_v3/config.xml index 630ecd4c6..4114143e5 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/config.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/config.xml @@ -2882,15 +2882,12 @@ This MUST follow the Enum MISSION_DESC::TIconId type="bool" value="true" /> - - - + + + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua b/code/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua index dd3af3c88..33a3810d3 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua +++ b/code/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua @@ -521,7 +521,7 @@ function GameR2Loading:validateLoading() local filename = GameR2Loading.CurrentFile - if string.find(filename, '\.r2', -3) == nil then + if string.find(filename, '.r2', -3) == nil then messageBox(i18n.get("uiR2EDLoadScenario_InvalidFileName")) return end diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/help.xml b/code/ryzom/client/data/gamedev/interfaces_v3/help.xml index 39cfb1af4..c774edd47 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/help.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/help.xml @@ -863,8 +863,10 @@ + + value="http://localhost:40917/www/html/index.php" /> + + + + + + - - - - - - - - diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/code/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index 07d081874..d36486e99 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/code/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -131,7 +131,7 @@ local function levelToForceRegion(level) end local function levelToLevelForce(level) - return math.floor(math.mod(level, 50) * 5 / 50) + 1 + return math.floor(math.fmod(level, 50) * 5 / 50) + 1 end diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/login_main.xml b/code/ryzom/client/data/gamedev/interfaces_v3/login_main.xml index f6dab0c1e..648cbbb6a 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/login_main.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/login_main.xml @@ -45,7 +45,7 @@ text_ref="BM BM" text_y="-2" reset_focus_on_hide="false" max_historic="0" onenter="set_keyboard_focus" params="target=ui:login:checkpass:content:submit_gr:eb_password:eb|select_all=false" - prompt="" enter_loose_focus="true" multi_line="false" max_num_chars="20" color="135 243 28 255" /> + prompt="" enter_loose_focus="true" multi_line="false" max_num_chars="12" color="135 243 28 255" /> + prompt="" enter_loose_focus="true" multi_line="false" max_num_chars="20" color="135 243 28 255" /> @@ -669,7 +669,7 @@ on_enter="leave_modal" options="no_bordure" mouse_pos="false" exit_key_pushed="t text_ref="BM BM" text_y="-2" on_focus="create_account_rules" on_focus_params="rules_password_conf" reset_focus_on_hide="false" max_historic="0" entry_type="password" onenter="set_keyboard_focus" params="target=ui:login:create_account:content:submit_gr:eb_email:eb|select_all=false" - prompt="" enter_loose_focus="true" multi_line="false" max_num_chars="8" color="135 243 28 255" /> + prompt="" enter_loose_focus="true" multi_line="false" max_num_chars="20" color="135 243 28 255" /> @@ -678,7 +678,7 @@ on_enter="leave_modal" options="no_bordure" mouse_pos="false" exit_key_pushed="t text_ref="BM BM" text_y="-2" on_focus="create_account_rules" on_focus_params="rules_email" reset_focus_on_hide="false" max_historic="0" onenter="" params="" - prompt="" enter_loose_focus="true" multi_line="false" max_num_chars="255" color="135 243 28 255" /> + prompt="" enter_loose_focus="true" multi_line="false" max_num_chars="254" color="135 243 28 255" /> - + + - + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/player.lua b/code/ryzom/client/data/gamedev/interfaces_v3/player.lua index c1abe7b22..062f09690 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/player.lua +++ b/code/ryzom/client/data/gamedev/interfaces_v3/player.lua @@ -803,8 +803,8 @@ end function game:timeInSecondsToReadableTime(regenTime) - local seconds = math.mod(regenTime, 60) - local minutes = math.mod(math.floor(regenTime / 60), 60) + local seconds = math.fmod(regenTime, 60) + local minutes = math.fmod(math.floor(regenTime / 60), 60) local hours = math.floor(regenTime / 3600) local result = "" if seconds > 0 then result = concatUCString(tostring(seconds), i18n.get("uittSecondsShort")) end diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua b/code/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua index d07f5abee..ca04561f1 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua +++ b/code/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua @@ -904,7 +904,7 @@ function RingAccessPoint:onDraw() self.LastRefreshTime = nltime.getLocalTime() / 1000 --self:getWindow():find("refreshText").active = false else - local waitText = i18n.get("uiRAP_WaitMsg" .. math.mod(os.time(), 3)) + local waitText = i18n.get("uiRAP_WaitMsg" .. math.fmod(os.time(), 3)) self:setInfoMessage(waitText) --local refreshText = self:getWindow():find("refreshText") --if not self.ListReceived then diff --git a/code/ryzom/client/src/CMakeLists.txt b/code/ryzom/client/src/CMakeLists.txt index 93b141c95..6a08a5e76 100644 --- a/code/ryzom/client/src/CMakeLists.txt +++ b/code/ryzom/client/src/CMakeLists.txt @@ -1,10 +1,15 @@ + +# Need clientsheets lib for sheets packer tool +ADD_SUBDIRECTORY(client_sheets) + +IF(WITH_RYZOM_CLIENT) + # These are Windows/MFC apps IF(WIN32) # ADD_SUBDIRECTORY(bug_report) SET(SEVENZIP_LIBRARY "ryzom_sevenzip") ENDIF(WIN32) -ADD_SUBDIRECTORY(client_sheets) ADD_SUBDIRECTORY(seven_zip) FILE(GLOB CFG ../*.cfg ../*.cfg.in) @@ -124,3 +129,5 @@ IF(WITH_PCH) ENDIF(WITH_PCH) INSTALL(TARGETS ryzom_client RUNTIME DESTINATION ${RYZOM_GAMES_PREFIX} COMPONENT client BUNDLE DESTINATION /Applications) + +ENDIF(WITH_RYZOM_CLIENT) diff --git a/code/ryzom/client/src/cdb_synchronised.cpp b/code/ryzom/client/src/cdb_synchronised.cpp index 08189fdd4..45c57dd55 100644 --- a/code/ryzom/client/src/cdb_synchronised.cpp +++ b/code/ryzom/client/src/cdb_synchronised.cpp @@ -318,7 +318,11 @@ void CCDBSynchronised::writeInitInProgressIntoUIDB() { CInterfaceManager *pIM = CInterfaceManager::getInstance(); if (pIM) - NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:CDB_INIT_IN_PROGRESS")->setValueBool(_InitInProgress); + { + NLMISC::CCDBNodeLeaf *node = m_CDBInitInProgressDB ? (&*m_CDBInitInProgressDB) + : &*(m_CDBInitInProgressDB = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:CDB_INIT_IN_PROGRESS")); + node->setValueBool(_InitInProgress); + } else nlwarning("InterfaceManager not created"); } diff --git a/code/ryzom/client/src/cdb_synchronised.h b/code/ryzom/client/src/cdb_synchronised.h index 7f8f1fb5e..e5c2f4876 100644 --- a/code/ryzom/client/src/cdb_synchronised.h +++ b/code/ryzom/client/src/cdb_synchronised.h @@ -151,6 +151,8 @@ private: bool allInitPacketReceived() const { return _InitDeltaReceived == 2; } // Classic database + inventory void writeInitInProgressIntoUIDB(); + + NLMISC::CRefPtr m_CDBInitInProgressDB; }; diff --git a/code/ryzom/client/src/commands.cpp b/code/ryzom/client/src/commands.cpp index 406d554e3..3805122f2 100644 --- a/code/ryzom/client/src/commands.cpp +++ b/code/ryzom/client/src/commands.cpp @@ -5164,7 +5164,7 @@ NLMISC_COMMAND(luaObject, "Dump the content of a lua object", " [max CLuaIHMRyzom::debugInfo(e.what()); return false; } - luaState->pushValue(LUA_GLOBALSINDEX); + luaState->pushGlobalTable(); CLuaObject env; env.pop(*luaState); uint maxDepth; diff --git a/code/ryzom/client/src/cursor_functions.cpp b/code/ryzom/client/src/cursor_functions.cpp index a51877be1..8c3bc3a32 100644 --- a/code/ryzom/client/src/cursor_functions.cpp +++ b/code/ryzom/client/src/cursor_functions.cpp @@ -58,6 +58,7 @@ uint32 MissionRingId = 0; UInstance selectedInstance; const UInstance noSelectedInstance; string selectedInstanceURL; +static NLMISC::CRefPtr s_UserCharFade; /////////////// @@ -273,7 +274,8 @@ void checkUnderCursor() entity= EntitiesMngr.getEntityUnderPos(cursX, cursY, ClientCfg.SelectionDist, isPlayerUnderCursor); // If the mouse is over the player make the player transparent - CCDBNodeLeaf *pNL = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:USER_CHAR_FADE", false); + CCDBNodeLeaf *pNL = s_UserCharFade ? &*s_UserCharFade + : &*(s_UserCharFade = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:USER_CHAR_FADE", false)); if ((pNL != NULL) && (pNL->getValue32() == 1) && UserEntity->selectable()) { // If the nearest entity is the player, hide! diff --git a/code/ryzom/client/src/entities.cpp b/code/ryzom/client/src/entities.cpp index eec5a6b5a..7bc478ce7 100644 --- a/code/ryzom/client/src/entities.cpp +++ b/code/ryzom/client/src/entities.cpp @@ -435,28 +435,47 @@ void CEntityManager::initialize(uint nbMaxEntity) for (i=0; igetDB()->addObserver(&MissionTargetObserver, textId ); + _MissionTargetTitleDB[i][j] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); + nlassert(_MissionTargetTitleDB[i][j]); } // Add an Observer to the Team database for (i=0; igetDB()->addObserver(&TeamUIDObserver, textId ); + _GroupMemberUidDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); + nlassert(_GroupMemberUidDB[i]); - textId = ICDBNode::CTextId( toString(TEAM_DB_PATH ":%d:NAME", i) ); + text = toString(TEAM_DB_PATH ":%d:NAME", i); + textId = ICDBNode::CTextId(text); NLGUI::CDBManager::getInstance()->getDB()->addObserver(&TeamPresentObserver, textId ); + _GroupMemberNameDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); + nlassert(_GroupMemberNameDB[i]); } // Add an Observer to the Animal database for (i=0; igetDB()->addObserver(&AnimalUIDObserver, textId ); + std::string text = toString("SERVER:PACK_ANIMAL:BEAST%d:UID", i); + textId = ICDBNode::CTextId(text); + NLGUI::CDBManager::getInstance()->getDB()->addObserver(&AnimalUIDObserver, textId); + _BeastUidDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); + nlassert(_BeastUidDB[i]); - textId = ICDBNode::CTextId( toString("SERVER:PACK_ANIMAL:BEAST%d:STATUS",i) ); - NLGUI::CDBManager::getInstance()->getDB()->addObserver(&AnimalStatusObserver, textId ); + text = toString("SERVER:PACK_ANIMAL:BEAST%d:STATUS", i); + textId = ICDBNode::CTextId(text); + NLGUI::CDBManager::getInstance()->getDB()->addObserver(&AnimalStatusObserver, textId); + _BeastStatusDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); + nlassert(_BeastStatusDB[i]); + + text = toString("SERVER:PACK_ANIMAL:BEAST%d:TYPE", i); + _BeastTypeDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); + nlassert(_BeastTypeDB[i]); } }// initialize // diff --git a/code/ryzom/client/src/entities.h b/code/ryzom/client/src/entities.h index 27551141a..f71240b63 100644 --- a/code/ryzom/client/src/entities.h +++ b/code/ryzom/client/src/entities.h @@ -29,6 +29,9 @@ #include "ground_fx_manager.h" #include "projectile_manager.h" #include "user_entity.h" +// Some constants +#include "game_share/mission_desc.h" +#include "game_share/inventories.h" // Misc. #include "nel/misc/types_nl.h" #include "nel/misc/stream.h" @@ -36,6 +39,7 @@ #include "nel/misc/vector.h" #include "nel/misc/file.h" #include "nel/misc/aabbox.h" +#include "nel/misc/cdb_leaf.h" // 3D #include "nel/3d/u_instance.h" // Std. @@ -149,6 +153,14 @@ private: NL3D::UInstance _LastInstanceUnderPos; + // DB node pointers used to update some entity flags + NLMISC::CRefPtr _MissionTargetTitleDB[MAX_NUM_MISSIONS][MAX_NUM_MISSION_TARGETS]; + NLMISC::CRefPtr _GroupMemberUidDB[8]; // MaxNumPeopleInTeam in people_interaction.h + NLMISC::CRefPtr _GroupMemberNameDB[8]; // MaxNumPeopleInTeam in people_interaction.h + NLMISC::CRefPtr _BeastUidDB[MAX_INVENTORY_ANIMAL]; + NLMISC::CRefPtr _BeastStatusDB[MAX_INVENTORY_ANIMAL]; + NLMISC::CRefPtr _BeastTypeDB[MAX_INVENTORY_ANIMAL]; + ////////////// //// DEBUG /// uint _NbUser; @@ -344,6 +356,13 @@ public: */ void refreshInsceneInterfaceOfFriendNPC(uint slot); + inline NLMISC::CCDBNodeLeaf *getMissionTargetTitleDB(int mission, int target) { return _MissionTargetTitleDB[mission][target]; } + inline NLMISC::CCDBNodeLeaf *getGroupMemberUidDB(int member) { return _GroupMemberUidDB[member]; } + inline NLMISC::CCDBNodeLeaf *getGroupMemberNameDB(int member) { return _GroupMemberNameDB[member]; } + inline NLMISC::CCDBNodeLeaf *getBeastUidDB(int beast) { return _BeastUidDB[beast]; } + inline NLMISC::CCDBNodeLeaf *getBeastStatusDB(int beast) { return _BeastStatusDB[beast]; } + inline NLMISC::CCDBNodeLeaf *getBeastTypeDB(int beast) { return _BeastTypeDB[beast]; } + private: // NB: don't return unselectable entities diff --git a/code/ryzom/client/src/entity_cl.cpp b/code/ryzom/client/src/entity_cl.cpp index 9aef8b1c8..0063c93f4 100644 --- a/code/ryzom/client/src/entity_cl.cpp +++ b/code/ryzom/client/src/entity_cl.cpp @@ -120,6 +120,7 @@ NLMISC::CRGBA CEntityCL::_PvpAllyColor; NLMISC::CRGBA CEntityCL::_GMTitleColor[CHARACTER_TITLE::EndGmTitle - CHARACTER_TITLE::BeginGmTitle + 1]; uint8 CEntityCL::_InvalidGMTitleCode = 0xFF; NLMISC::CRefPtr CEntityCL::_OpacityMinNodeLeaf; +NLMISC::CRefPtr CEntityCL::_ShowReticleLeaf; // Context help @@ -2646,7 +2647,7 @@ void CEntityCL::updateMissionTarget() for (j=0; jgetDbProp("SERVER:MISSIONS:"+toString(i)+":TARGET"+toString(j)+":TITLE", false); + CCDBNodeLeaf *prop = EntitiesMngr.getMissionTargetTitleDB(i, j); // NLGUI::CDBManager::getInstance()->getDbProp("SERVER:MISSIONS:"+toString(i)+":TARGET"+toString(j)+":TITLE", false); if (prop) { _MissionTarget = _NameId == (uint32)prop->getValue32(); @@ -2846,8 +2847,8 @@ void CEntityCL::updateIsInTeam () for (uint i=0; igetDbProp(toString(TEAM_DB_PATH ":%d:UID", i), false); - CCDBNodeLeaf *presentProp = NLGUI::CDBManager::getInstance()->getDbProp(toString(TEAM_DB_PATH ":%d:NAME", i), false); + CCDBNodeLeaf *uidProp = EntitiesMngr.getGroupMemberUidDB(i); + CCDBNodeLeaf *presentProp = EntitiesMngr.getGroupMemberNameDB(i); // If same Entity uid than the one in the Database, ok the entity is in the Player TEAM!! if (uidProp && uidProp->getValue32() == (sint32)dataSetId() && presentProp && presentProp->getValueBool() ) @@ -2876,9 +2877,9 @@ void CEntityCL::updateIsUserAnimal () for (uint i=0; igetDbProp(toString("SERVER:PACK_ANIMAL:BEAST%d:UID", i), false); - CCDBNodeLeaf *statusProp = NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:PACK_ANIMAL:BEAST%d:STATUS", i), false); - CCDBNodeLeaf *typeProp = NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:PACK_ANIMAL:BEAST%d:TYPE", i), false); + CCDBNodeLeaf *uidProp = EntitiesMngr.getBeastUidDB(i); + CCDBNodeLeaf *statusProp = EntitiesMngr.getBeastStatusDB(i); + CCDBNodeLeaf *typeProp = EntitiesMngr.getBeastTypeDB(i); // I must have the same Id, and the animal entry must be ok. if(uidProp && statusProp && typeProp && uidProp->getValue32() == (sint32)dataSetId() && ANIMAL_STATUS::isSpawned((ANIMAL_STATUS::EAnimalStatus)(statusProp->getValue32()) )) @@ -3041,7 +3042,9 @@ void CEntityCL::updateVisiblePostPos(const NLMISC::TTime &/* currentTimeInMs */, bool bShowReticle = true; - CCDBNodeLeaf* node = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:SHOW_RETICLE"); + CCDBNodeLeaf *node = (CCDBNodeLeaf *)_ShowReticleLeaf ? &*_ShowReticleLeaf + : &*(_ShowReticleLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:SHOW_RETICLE", false)); + if (node) { bShowReticle = node->getValueBool(); diff --git a/code/ryzom/client/src/entity_cl.h b/code/ryzom/client/src/entity_cl.h index 696efc61d..f7a26e03f 100644 --- a/code/ryzom/client/src/entity_cl.h +++ b/code/ryzom/client/src/entity_cl.h @@ -1111,7 +1111,8 @@ protected: // for localSelectBox() computing sint64 _LastLocalSelectBoxComputeTime; - static NLMISC::CRefPtr _OpacityMinNodeLeaf; + static NLMISC::CRefPtr _OpacityMinNodeLeaf; + static NLMISC::CRefPtr _ShowReticleLeaf; protected: /** diff --git a/code/ryzom/client/src/interface_v3/action_handler_misc.cpp b/code/ryzom/client/src/interface_v3/action_handler_misc.cpp index 6a21858f5..54c8b6fac 100644 --- a/code/ryzom/client/src/interface_v3/action_handler_misc.cpp +++ b/code/ryzom/client/src/interface_v3/action_handler_misc.cpp @@ -425,14 +425,15 @@ class CActionHandlerAddLink : public IActionHandler } std::vector targetsVect; - bool result = CInterfaceLink::splitLinkTargets(targets, parentGroup, targetsVect); + std::vector cdbTargetsVect; + bool result = CInterfaceLink::splitLinkTargetsExt(targets, parentGroup, targetsVect, cdbTargetsVect); if (!result) { nlwarning(" Couldn't parse all links"); } // add the link CInterfaceLink *il = new CInterfaceLink; - il->init(targetsVect, expr, ah, ahparam, ahcond, parentGroup); + il->init(targetsVect, cdbTargetsVect, expr, ah, ahparam, ahcond, parentGroup); CInterfaceManager *im = CInterfaceManager::getInstance(); CWidgetManager::getInstance()->getParser()->addLink(il, id); il->update(); diff --git a/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp b/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp index 088bcc571..ae06d0997 100644 --- a/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp +++ b/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp @@ -108,7 +108,7 @@ ucstring CControlSheetTooltipInfoWaiter::infoValidated(CDBCtrlSheet* ctrlSheet, CLuaStackRestorer lsr(ls, 0); CLuaIHM::pushReflectableOnStack(*ls, (CReflectableRefPtrTarget *)ctrlSheet); - ls->pushValue(LUA_GLOBALSINDEX); + ls->pushGlobalTable(); CLuaObject game(*ls); game = game["game"]; game.callMethodByNameNoThrow(luaMethodName.c_str(), 1, 1); @@ -3170,7 +3170,7 @@ void CDBCtrlSheet::getContextHelp(ucstring &help) const _PhraseAdapter = new CSPhraseComAdpater; _PhraseAdapter->Phrase = pPM->getPhrase(phraseId); CLuaIHM::pushReflectableOnStack(*ls, _PhraseAdapter); - ls->pushValue(LUA_GLOBALSINDEX); + ls->pushGlobalTable(); CLuaObject game(*ls); game = game["game"]; game.callMethodByNameNoThrow("updatePhraseTooltip", 1, 1); diff --git a/code/ryzom/client/src/interface_v3/group_in_scene_user_info.cpp b/code/ryzom/client/src/interface_v3/group_in_scene_user_info.cpp index e313c7ae4..76d97c519 100644 --- a/code/ryzom/client/src/interface_v3/group_in_scene_user_info.cpp +++ b/code/ryzom/client/src/interface_v3/group_in_scene_user_info.cpp @@ -41,16 +41,77 @@ uint CGroupInSceneUserInfo::_BatLength = 0; CCDBNodeLeaf *CGroupInSceneUserInfo::_Value = NULL; CCDBNodeLeaf *CGroupInSceneUserInfo::_ValueBegin = NULL; CCDBNodeLeaf *CGroupInSceneUserInfo::_ValueEnd = NULL; +NLMISC::CRefPtr CGroupInSceneUserInfo::_GuildIconLeaf[256]; // *************************************************************************** NLMISC_REGISTER_OBJECT(CViewBase, CGroupInSceneUserInfo, std::string, "in_scene_user_info"); REGISTER_UI_CLASS(CGroupInSceneUserInfo) +namespace { + +// Has more entries than actually in config, as not all types have all entries. +class CConfigSaveInsceneDB +{ +public: + void setPrefix(const std::string &prefix) { _DBPrefix = prefix; } + inline NLMISC::CCDBNodeLeaf *getGuildSymbol() { return _GuildSymbol ? (&*_GuildSymbol) : &*(_GuildSymbol = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "GUILD_SYMBOL")); } + inline NLMISC::CCDBNodeLeaf *getName() { return _Name ? (&*_Name) : &*(_Name = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "NAME")); } + inline NLMISC::CCDBNodeLeaf *getTitle() { return _Title ? (&*_Title) : &*(_Title = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "TITLE")); } + inline NLMISC::CCDBNodeLeaf *getRPTags() { return _RPTags ? (&*_RPTags) : &*(_RPTags = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "RPTAGS")); } + inline NLMISC::CCDBNodeLeaf *getGuildName() { return _GuildName ? (&*_GuildName) : &*(_GuildName = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "GUILD_NAME")); } + inline NLMISC::CCDBNodeLeaf *getHP() { return _HP ? (&*_HP) : &*(_HP = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "HP")); } + inline NLMISC::CCDBNodeLeaf *getSta() { return _Sta ? (&*_Sta) : &*(_Sta = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "STA")); } + inline NLMISC::CCDBNodeLeaf *getSap() { return _Sap ? (&*_Sap) : &*(_Sap = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "SAP")); } + inline NLMISC::CCDBNodeLeaf *getFocus() { return _Focus ? (&*_Focus) : &*(_Focus = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "FOCUS")); } + inline NLMISC::CCDBNodeLeaf *getAction() { return _Action ? (&*_Action) : &*(_Action = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "ACTION")); } + inline NLMISC::CCDBNodeLeaf *getMessages() { return _Messages ? (&*_Messages) : &*(_Messages = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "MESSAGES")); } + inline NLMISC::CCDBNodeLeaf *getPvPLogo() { return _PvPLogo ? (&*_PvPLogo) : &*(_PvPLogo = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "PVP_LOGO")); } + inline NLMISC::CCDBNodeLeaf *getNPCName() { return _NPCName ? (&*_NPCName) : &*(_NPCName = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "NPCNAME")); } + inline NLMISC::CCDBNodeLeaf *getNPCTitle() { return _NPCTitle ? (&*_NPCTitle) : &*(_NPCTitle = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "NPCTITLE")); } + inline NLMISC::CCDBNodeLeaf *getMissionIcon() { return _MissionIcon ? (&*_MissionIcon) : &*(_MissionIcon = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "MISSION_ICON")); } + inline NLMISC::CCDBNodeLeaf *getMiniMissionIcon() { return _MiniMissionIcon ? (&*_MiniMissionIcon) : &*(_MiniMissionIcon = NLGUI::CDBManager::getInstance()->getDbProp(_DBPrefix + "MINI_MISSION_ICON")); } +private: + std::string _DBPrefix; + NLMISC::CRefPtr _GuildSymbol; + NLMISC::CRefPtr _Name; + NLMISC::CRefPtr _Title; + NLMISC::CRefPtr _RPTags; + NLMISC::CRefPtr _GuildName; + NLMISC::CRefPtr _HP; + NLMISC::CRefPtr _Sta; + NLMISC::CRefPtr _Sap; + NLMISC::CRefPtr _Focus; + NLMISC::CRefPtr _Action; + NLMISC::CRefPtr _Messages; + NLMISC::CRefPtr _PvPLogo; + NLMISC::CRefPtr _NPCName; + NLMISC::CRefPtr _NPCTitle; + NLMISC::CRefPtr _MissionIcon; + NLMISC::CRefPtr _MiniMissionIcon; +}; + +CConfigSaveInsceneDB _ConfigSaveInsceneDB[4]; // USER/FRIEND/ENEMY/SOURCE +bool _ConfigSaveInsceneDBInit = false; + +#define SAVE_USER 0 +#define SAVE_FRIEND 1 +#define SAVE_ENEMY 2 +#define SAVE_SOURCE 3 + +} CGroupInSceneUserInfo::CGroupInSceneUserInfo(const TCtorParam ¶m) : CGroupInScene(param) { + if (!_ConfigSaveInsceneDBInit) + { + _ConfigSaveInsceneDB[0].setPrefix("UI:SAVE:INSCENE:USER:"); + _ConfigSaveInsceneDB[1].setPrefix("UI:SAVE:INSCENE:FRIEND:"); + _ConfigSaveInsceneDB[2].setPrefix("UI:SAVE:INSCENE:ENEMY:"); + _ConfigSaveInsceneDB[3].setPrefix("UI:SAVE:INSCENE:SOURCE:"); + _ConfigSaveInsceneDBInit = true; + } _Name = NULL; _Title = NULL; _GuildName = NULL; @@ -130,7 +191,7 @@ CGroupInSceneUserInfo *CGroupInSceneUserInfo::build (CEntityCL *entity) bool needPvPLogo= false; bool permanentContent = false; bool rpTags = false; - bool displayMissionIcons = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:INSCENE:FRIEND:MISSION_ICON")->getValueBool(); + bool displayMissionIcons = _ConfigSaveInsceneDB[SAVE_FRIEND].getMissionIcon()->getValueBool(); // Names const char *templateName; @@ -156,7 +217,6 @@ CGroupInSceneUserInfo *CGroupInSceneUserInfo::build (CEntityCL *entity) // Active fields and bars if ( isForageSource ) { - string dbEntry = "UI:SAVE:INSCENE:SOURCE:"; CForageSourceCL *forageSource = static_cast(entity); name = !entityName.empty() /*&& NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"NAME")->getValueBool()*/; @@ -175,32 +235,32 @@ CGroupInSceneUserInfo *CGroupInSceneUserInfo::build (CEntityCL *entity) } else if(npcFriendAndNeutral) { - string dbEntry; + int dbEntry; getBarSettings( pIM, user, entity->isPlayer(), _friend, dbEntry, bars ); // For RoleMasters, merchants etc... must display name and function, and nothing else for(uint i=0;igetDbProp(dbEntry+"NPCNAME")->getValueBool(); + name= !entityName.empty() && _ConfigSaveInsceneDB[dbEntry].getNPCName()->getValueBool(); symbol= false; - title= !entityTitle.empty() && CDBManager::getInstance()->getDbProp(dbEntry+"NPCTITLE")->getValueBool(); + title= !entityTitle.empty() && _ConfigSaveInsceneDB[dbEntry].getNPCTitle()->getValueBool(); guildName= false; templateName = "in_scene_user_info"; - rpTags = (!entityTag1.empty() || !entityTag2.empty() || !entityTag3.empty() || !entityTag4.empty() ) && NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"RPTAGS")->getValueBool(); + rpTags = (!entityTag1.empty() || !entityTag2.empty() || !entityTag3.empty() || !entityTag4.empty() ) && _ConfigSaveInsceneDB[dbEntry].getRPTags()->getValueBool(); } else { // Base entry in database - string dbEntry; + int dbEntry; getBarSettings( pIM, user, entity->isPlayer(), _friend, dbEntry, bars ); - name = !entityName.empty() && NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"NAME")->getValueBool(); - title = !entityTitle.empty() && NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"TITLE")->getValueBool(); - rpTags = (!entityTag1.empty() || !entityTag2.empty() || !entityTag3.empty() || !entityTag4.empty() ) && NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"RPTAGS")->getValueBool(); + name = !entityName.empty() && _ConfigSaveInsceneDB[dbEntry].getName()->getValueBool(); + title = !entityTitle.empty() && _ConfigSaveInsceneDB[dbEntry].getTitle()->getValueBool(); + rpTags = (!entityTag1.empty() || !entityTag2.empty() || !entityTag3.empty() || !entityTag4.empty() ) && _ConfigSaveInsceneDB[dbEntry].getRPTags()->getValueBool(); // if name is empty but not title, title is displayed as name - if (!title && entityName.empty() && !entityTitle.empty() && NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"NAME")->getValueBool()) + if (!title && entityName.empty() && !entityTitle.empty() && _ConfigSaveInsceneDB[dbEntry].getName()->getValueBool()) title = true; templateName = "in_scene_user_info"; // special guild - if(NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"GUILD_SYMBOL")->getValueBool()) + if(_ConfigSaveInsceneDB[dbEntry].getGuildSymbol()->getValueBool()) { // if symbol not still available, wait for one when VP received symbol = (entity->getGuildSymbol() != 0); @@ -211,7 +271,7 @@ CGroupInSceneUserInfo *CGroupInSceneUserInfo::build (CEntityCL *entity) symbol= false; needGuildSymbolId = false; } - if(NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"GUILD_NAME")->getValueBool()) + if(_ConfigSaveInsceneDB[dbEntry].getGuildName()->getValueBool()) { // if guild name not still available, wait for one when VP received guildName = (entity->getGuildNameID() != 0); @@ -222,7 +282,7 @@ CGroupInSceneUserInfo *CGroupInSceneUserInfo::build (CEntityCL *entity) guildName= false; needGuildNameId= false; } - needPvPLogo = NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"PVP_LOGO")->getValueBool(); + needPvPLogo = _ConfigSaveInsceneDB[dbEntry].getPvPLogo()->getValueBool(); eventFaction = (entity->getEventFactionID() != 0); } @@ -799,9 +859,9 @@ REGISTER_ACTION_HANDLER( CHandlerResetCharacterInScene, "reset_character_in_scen // *************************************************************************** -void CGroupInSceneUserInfo::getBarSettings( CInterfaceManager* pIM, bool isUser, bool isPlayer, bool isFriend, std::string& dbEntry, bool *bars ) +void CGroupInSceneUserInfo::getBarSettings( CInterfaceManager* pIM, bool isUser, bool isPlayer, bool isFriend, int &dbEntry, bool *bars ) { - dbEntry = isUser?"UI:SAVE:INSCENE:USER:":isFriend?"UI:SAVE:INSCENE:FRIEND:":"UI:SAVE:INSCENE:ENEMY:"; + dbEntry = isUser?SAVE_USER:isFriend?SAVE_FRIEND:SAVE_ENEMY; // if currently is edition mode, then bars are not displayed if (ClientCfg.R2EDEnabled && R2::isEditionCurrent()) { @@ -813,11 +873,11 @@ void CGroupInSceneUserInfo::getBarSettings( CInterfaceManager* pIM, bool isUser, } else { - bars[HP] = NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"HP")->getValueBool(); - bars[SAP] = (isUser || isFriend) && (isUser || isPlayer) && NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"SAP")->getValueBool(); - bars[STA] = (isUser || isFriend) && (isUser || isPlayer) && NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"STA")->getValueBool(); - bars[Focus] = (isUser || isFriend) && (isUser || isPlayer) && NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"FOCUS")->getValueBool(); - bars[Action] = (isUser) && NLGUI::CDBManager::getInstance()->getDbProp(dbEntry+"ACTION")->getValueBool(); + bars[HP] = _ConfigSaveInsceneDB[dbEntry].getHP()->getValueBool(); + bars[SAP] = (isUser || isFriend) && (isUser || isPlayer) && _ConfigSaveInsceneDB[dbEntry].getSap()->getValueBool(); + bars[STA] = (isUser || isFriend) && (isUser || isPlayer) && _ConfigSaveInsceneDB[dbEntry].getSta()->getValueBool(); + bars[Focus] = (isUser || isFriend) && (isUser || isPlayer) && _ConfigSaveInsceneDB[dbEntry].getFocus()->getValueBool(); + bars[Action] = (isUser) && _ConfigSaveInsceneDB[dbEntry].getAction()->getValueBool(); } } @@ -831,7 +891,7 @@ void CGroupInSceneUserInfo::setLeftGroupActive( bool active ) if ( _Entity->isUser() || _Entity->isForageSource() ) return; - string dbEntry; + int dbEntry; bool barSettings [NumBars]; getBarSettings( CInterfaceManager::getInstance(), _Entity->isUser(), _Entity->isPlayer(), _Entity->isViewedAsFriend(), dbEntry, barSettings ); @@ -943,8 +1003,13 @@ void CGroupInSceneUserInfo::updateDynamicData () if (_Entity->getGuildSymbol() != 0) { CInterfaceManager *pIM = CInterfaceManager::getInstance(); - string dbLeaf = "UI:ENTITY:GUILD:"+toString (_Entity->slot())+":ICON"; - NLGUI::CDBManager::getInstance()->getDbProp(dbLeaf)->setValue64(_Entity->getGuildSymbol()); + if (!_GuildIconLeaf[_Entity->slot()]) + { + string dbLeaf = "UI:ENTITY:GUILD:"+toString (_Entity->slot())+":ICON"; + _GuildIconLeaf[_Entity->slot()] = NLGUI::CDBManager::getInstance()->getDbProp(dbLeaf); + } + nlassert(&*_GuildIconLeaf[_Entity->slot()]); + (&*_GuildIconLeaf[_Entity->slot()])->setValue64(_Entity->getGuildSymbol()); } // Set the event faction diff --git a/code/ryzom/client/src/interface_v3/group_in_scene_user_info.h b/code/ryzom/client/src/interface_v3/group_in_scene_user_info.h index 4a9dd6ddd..3869a74b1 100644 --- a/code/ryzom/client/src/interface_v3/group_in_scene_user_info.h +++ b/code/ryzom/client/src/interface_v3/group_in_scene_user_info.h @@ -72,7 +72,7 @@ protected: }; /// Fill NumBars elements into bars and set dbEntry - static void getBarSettings( CInterfaceManager* pIM, bool isUser, bool isPlayer, bool isFriend, std::string& dbEntry, bool *bars ); + static void getBarSettings( CInterfaceManager* pIM, bool isUser, bool isPlayer, bool isFriend, int &dbEntry, bool *bars ); // The entity (character or forage source) CEntityCL *_Entity; @@ -97,6 +97,9 @@ protected: static NLMISC::CCDBNodeLeaf *_ValueBegin; static NLMISC::CCDBNodeLeaf *_ValueEnd; + // Guild icon leafs + static NLMISC::CRefPtr _GuildIconLeaf[256]; + // Special guild bool _NeedGuildNameId; bool _NeedGuildSymbolId; diff --git a/code/ryzom/client/src/interface_v3/interface_manager.cpp b/code/ryzom/client/src/interface_v3/interface_manager.cpp index d352aff91..9d1cb364a 100644 --- a/code/ryzom/client/src/interface_v3/interface_manager.cpp +++ b/code/ryzom/client/src/interface_v3/interface_manager.cpp @@ -511,6 +511,8 @@ CInterfaceManager::CInterfaceManager() _LogState = false; _KeysLoaded = false; CWidgetManager::getInstance()->resetColorProps(); + CWidgetManager::getInstance()->resetAlphaRolloverSpeedProps(); + CWidgetManager::getInstance()->resetGlobalAlphasProps(); _NeutralColor = NULL; _WarningColor = NULL; _ErrorColor = NULL; @@ -1420,8 +1422,9 @@ void CInterfaceManager::uninitInGame1 () _NeutralColor = NULL; _WarningColor = NULL; _ErrorColor = NULL; - CWidgetManager::getInstance()->resetAlphaRolloverSpeed(); CWidgetManager::getInstance()->resetColorProps(); + CWidgetManager::getInstance()->resetAlphaRolloverSpeedProps(); + CWidgetManager::getInstance()->resetGlobalAlphasProps(); #ifdef AJM_DEBUG_TRACK_INTERFACE_GROUPS CInterfaceManager::getInstance()->DebugTrackGroupsDump(); @@ -1978,7 +1981,11 @@ void CInterfaceManager::drawViews(NL3D::UCamera camera) // Update Player characteristics (for Item carac requirement Redifying) nlctassert(CHARACTERISTICS::NUM_CHARACTERISTICS==8); for (uint i=0; igetDbValue32(toString("SERVER:CHARACTER_INFO:CHARACTERISTICS%d:VALUE", i)); + { + NLMISC::CCDBNodeLeaf *node = _CurrentPlayerCharacLeaf[i] ? &*_CurrentPlayerCharacLeaf[i] + : &*(_CurrentPlayerCharacLeaf[i] = NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:CHARACTERISTICS%d:VALUE", i), false)); + _CurrentPlayerCharac[i] = node ? node->getValue32() : 0; + } CWidgetManager::getInstance()->drawViews( camera ); diff --git a/code/ryzom/client/src/interface_v3/interface_manager.h b/code/ryzom/client/src/interface_v3/interface_manager.h index 567c07a7b..36bd909e3 100644 --- a/code/ryzom/client/src/interface_v3/interface_manager.h +++ b/code/ryzom/client/src/interface_v3/interface_manager.h @@ -633,7 +633,8 @@ private: std::vector _EmoteCmds; // Item Carac requirement - sint32 _CurrentPlayerCharac[CHARACTERISTICS::NUM_CHARACTERISTICS]; + sint32 _CurrentPlayerCharac[CHARACTERISTICS::NUM_CHARACTERISTICS]; + NLMISC::CRefPtr _CurrentPlayerCharacLeaf[CHARACTERISTICS::NUM_CHARACTERISTICS]; // observers for copying database branch changes CServerToLocalAutoCopy ServerToLocalAutoCopyInventory; diff --git a/code/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp b/code/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp index 06b0b8557..fe4c6a716 100644 --- a/code/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp +++ b/code/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp @@ -187,9 +187,11 @@ static DECLARE_INTERFACE_USER_FCT(lua) // *** clear return value const std::string retId= "__ui_internal_ret_"; CLuaStackChecker lsc(&ls); + ls.pushGlobalTable(); ls.push(retId); ls.pushNil(); - ls.setTable(LUA_GLOBALSINDEX); + ls.setTable(-3); //pop pop + ls.pop(); // *** execute script @@ -201,8 +203,10 @@ static DECLARE_INTERFACE_USER_FCT(lua) // *** retrieve and convert return value + ls.pushGlobalTable(); ls.push(retId); - ls.getTable(LUA_GLOBALSINDEX); + ls.getTable(-2); + ls.remove(-2); bool ok= false; sint type= ls.type(); if (type==LUA_TBOOLEAN) @@ -370,7 +374,7 @@ void CLuaIHMRyzom::RegisterRyzomFunctions( NLGUI::CLuaState &ls ) ls.registerFunc("SNode", CUICtor::SNode); // *** Register the metatable for access to client.cfg (nb nico this may be more general later -> access to any config file ...) - ls.pushValue(LUA_GLOBALSINDEX); + ls.pushGlobalTable(); CLuaObject globals(ls); CLuaObject clientCfg = globals.newTable("config"); CLuaObject mt = globals.newTable("__cfmt"); diff --git a/code/ryzom/client/src/interface_v3/people_interraction.cpp b/code/ryzom/client/src/interface_v3/people_interraction.cpp index b0a050f29..95b091c22 100644 --- a/code/ryzom/client/src/interface_v3/people_interraction.cpp +++ b/code/ryzom/client/src/interface_v3/people_interraction.cpp @@ -558,7 +558,8 @@ void CPeopleInterraction::createTeamList() { CInterfaceLink *il = new CInterfaceLink; vector targets; - il->init(targets, sExpr, sAction, sParams, sCond, TeamChat->getContainer()); + vector cdbTargets; + il->init(targets, cdbTargets, sExpr, sAction, sParams, sCond, TeamChat->getContainer()); } } diff --git a/code/ryzom/client/src/interface_v3/sphrase_manager.cpp b/code/ryzom/client/src/interface_v3/sphrase_manager.cpp index 8abb66c8c..3d6155d23 100644 --- a/code/ryzom/client/src/interface_v3/sphrase_manager.cpp +++ b/code/ryzom/client/src/interface_v3/sphrase_manager.cpp @@ -941,6 +941,8 @@ void CSPhraseManager::reset() CSkillManager *pSM= CSkillManager::getInstance(); pBM->removeBrickLearnedCallback(&_ProgressionUpdate); pSM->removeSkillChangeCallback(&_ProgressionUpdate); + + _TotalMalusEquipLeaf = NULL; } // *************************************************************************** @@ -1122,7 +1124,9 @@ void CSPhraseManager::buildPhraseDesc(ucstring &text, const CSPhraseCom &phrase, // **** Compute Phrase Elements from phrase // get the current action malus (0-100) uint32 totalActionMalus= 0; - CCDBNodeLeaf *actMalus= NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:TOTAL_MALUS_EQUIP", false); + CCDBNodeLeaf *actMalus = _TotalMalusEquipLeaf ? &*_TotalMalusEquipLeaf + : &*(_TotalMalusEquipLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:TOTAL_MALUS_EQUIP", false)); + // root brick must not be Power or aura, because Action malus don't apply to them // (ie leave 0 ActionMalus for Aura or Powers if(actMalus && !rootBrick->isSpecialPower()) @@ -1652,7 +1656,8 @@ float CSPhraseManager::getPhraseSumBrickProp(const CSPhraseCom &phrase, uint else if(propId==CSBrickManager::getInstance()->StaPropId && brick->Properties[j].PropId==CSBrickManager::getInstance()->StaWeightFactorId) { CInterfaceManager *im = CInterfaceManager::getInstance(); - uint32 weight = (uint32) NLGUI::CDBManager::getInstance()->getDbProp("SERVER:USER:DEFAULT_WEIGHT_HANDS")->getValue32() / 10; // weight must be in dg here + if (!_ServerUserDefaultWeightHandsLeaf) _ServerUserDefaultWeightHandsLeaf = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:USER:DEFAULT_WEIGHT_HANDS"); + uint32 weight = (uint32)(&*_ServerUserDefaultWeightHandsLeaf)->getValue32() / 10; // weight must be in dg here CDBCtrlSheet *ctrlSheet = dynamic_cast(CWidgetManager::getInstance()->getElementFromId("ui:interface:gestionsets:hands:handr")); if (ctrlSheet) { @@ -4501,7 +4506,8 @@ uint32 CSPhraseManager::getTotalActionMalus(const CSPhraseCom &phrase) const CInterfaceManager *pIM = CInterfaceManager::getInstance(); CSBrickManager *pBM= CSBrickManager::getInstance(); uint32 totalActionMalus= 0; - CCDBNodeLeaf *actMalus= NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:TOTAL_MALUS_EQUIP", false); + CCDBNodeLeaf *actMalus = _TotalMalusEquipLeaf ? &*_TotalMalusEquipLeaf + : &*(_TotalMalusEquipLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:TOTAL_MALUS_EQUIP", false)); // root brick must not be Power or aura, because Action malus don't apply to them // (ie leave 0 ActionMalus for Aura or Powers if (!phrase.Bricks.empty()) diff --git a/code/ryzom/client/src/interface_v3/sphrase_manager.h b/code/ryzom/client/src/interface_v3/sphrase_manager.h index b28ff39ed..c14b584ab 100644 --- a/code/ryzom/client/src/interface_v3/sphrase_manager.h +++ b/code/ryzom/client/src/interface_v3/sphrase_manager.h @@ -651,6 +651,10 @@ private: void computePhraseProgression(); void insertProgressionSkillRecurs(SKILLS::ESkills skill, uint32 value, sint *skillReqLevel, std::vector &skillsToInsert); + mutable NLMISC::CRefPtr _TotalMalusEquipLeaf; + + NLMISC::CRefPtr _ServerUserDefaultWeightHandsLeaf; + // @} /// return the skill of the root diff --git a/code/ryzom/client/src/main_loop.cpp b/code/ryzom/client/src/main_loop.cpp index 45c6b5b3a..59519fc69 100644 --- a/code/ryzom/client/src/main_loop.cpp +++ b/code/ryzom/client/src/main_loop.cpp @@ -382,6 +382,9 @@ CGameContextMenu GameContextMenu; NLMISC::CValueSmoother smoothFPS; NLMISC::CValueSmoother moreSmoothFPS(64); +static CRefPtr s_FpsLeaf; +static CRefPtr s_UiDirectionLeaf; + // Profile /* @@ -2296,7 +2299,8 @@ bool mainLoop() deltaTime = smoothFPS.getSmoothValue (); if (deltaTime > 0.0) { - CCDBNodeLeaf*pNL = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:FPS"); + CCDBNodeLeaf *pNL = s_FpsLeaf ? &*s_FpsLeaf + : &*(s_FpsLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:FPS")); pNL->setValue64((sint64)(1.f/deltaTime)); } } @@ -2801,8 +2805,10 @@ bool mainLoop() H_AUTO_USE ( RZ_Client_Main_Loop_Net ) // Put here things you have to send to the server only once per tick like user position. // UPDATE COMPASS + NLMISC::CCDBNodeLeaf *node = s_UiDirectionLeaf ? (&*s_UiDirectionLeaf) + : &*(s_UiDirectionLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:DIRECTION")); CInterfaceProperty prop; - prop.readDouble("UI:VARIABLES:DIRECTION"," "); + prop.setNodePtr(node); if(CompassMode == 1) { double camDir = atan2(View.view().y, View.view().x); @@ -3235,7 +3241,7 @@ class CHandlerDebugUiDumpElementUnderMouse : public IActionHandler if (!lua) return; CLuaStackRestorer lsr(lua, 0); CLuaIHM::pushUIOnStack(*lua, HighlightedDebugUI); - lua->pushValue(LUA_GLOBALSINDEX); + lua->pushGlobalTable(); CLuaObject env(*lua); env["inspect"].callNoThrow(1, 0); } diff --git a/code/ryzom/client/src/motion/user_controls.cpp b/code/ryzom/client/src/motion/user_controls.cpp index b780927e2..527bfb5d4 100644 --- a/code/ryzom/client/src/motion/user_controls.cpp +++ b/code/ryzom/client/src/motion/user_controls.cpp @@ -294,7 +294,9 @@ void CUserControls::update() // update camera collision once per frame View.updateCameraCollision(); - NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:MK_MOVE")->setValue32(autowalkState()); + NLMISC::CCDBNodeLeaf *node = _UiVarMkMoveDB ? &*_UiVarMkMoveDB + : &*(_UiVarMkMoveDB = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:MK_MOVE")); + node->setValue32(autowalkState()); }// update // diff --git a/code/ryzom/client/src/motion/user_controls.h b/code/ryzom/client/src/motion/user_controls.h index be1cbaf99..eb4de2020 100644 --- a/code/ryzom/client/src/motion/user_controls.h +++ b/code/ryzom/client/src/motion/user_controls.h @@ -31,6 +31,9 @@ // Std. #include +namespace NLMISC { + class CCDBNodeLeaf; +} /////////// // CLASS // @@ -305,6 +308,8 @@ private: /// when true the next forward action will cancel any moveto bool _NextForwardCancelMoveTo; + + NLMISC::CRefPtr _UiVarMkMoveDB; }; /// User Controls (mouse, keyboard, interfaces, ...) diff --git a/code/ryzom/client/src/net_manager.cpp b/code/ryzom/client/src/net_manager.cpp index f9a5628ca..1eedc16c5 100644 --- a/code/ryzom/client/src/net_manager.cpp +++ b/code/ryzom/client/src/net_manager.cpp @@ -3861,22 +3861,28 @@ bool CNetManager::update() CInterfaceManager *im = CInterfaceManager::getInstance(); if (im) { - CCDBNodeLeaf *node = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:PING", false); + CCDBNodeLeaf *node = m_PingLeaf ? &*m_PingLeaf + : &*(m_PingLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:PING", false)); if (node) node->setValue32(getPing()); - node = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:UPLOAD", false); + node = m_UploadLeaf ? &*m_UploadLeaf + : &*(m_UploadLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:UPLOAD", false)); if (node) node->setValue32((sint32)(getMeanUpload()*1024.f/8.f)); - node = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:DOWNLOAD", false); + node = m_DownloadLeaf ? &*m_DownloadLeaf + : &*(m_DownloadLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:DOWNLOAD", false)); if (node) node->setValue32((sint32)(getMeanDownload()*1024.f/8.f)); - node = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:PACKETLOST", false); + node = m_PacketLostLeaf ? &* m_PacketLostLeaf + : &*(m_PacketLostLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:PACKETLOST", false)); if (node) node->setValue32((sint32)getMeanPacketLoss()); - node = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:SERVERSTATE", false); + node = m_ServerStateLeaf ? &*m_ServerStateLeaf + : &*(m_ServerStateLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:SERVERSTATE", false)); if (node) node->setValue32((sint32)getConnectionState()); - node = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:CONNECTION_QUALITY", false); + node = m_ConnectionQualityLeaf ? &*m_ConnectionQualityLeaf + : &*(m_ConnectionQualityLeaf = NLGUI::CDBManager::getInstance()->getDbProp("UI:VARIABLES:CONNECTION_QUALITY", false)); if (node) node->setValue32((sint32)getConnectionQuality()); } diff --git a/code/ryzom/client/src/net_manager.h b/code/ryzom/client/src/net_manager.h index 9fef4bc1d..06d6a7621 100644 --- a/code/ryzom/client/src/net_manager.h +++ b/code/ryzom/client/src/net_manager.h @@ -43,6 +43,7 @@ void initializeNetwork(); namespace NLMISC { class CBitMemStream; + class CCDBNodeLeaf; }; @@ -126,6 +127,13 @@ public: protected: bool _IsReplayStarting; #endif + + NLMISC::CRefPtr m_PingLeaf; + NLMISC::CRefPtr m_UploadLeaf; + NLMISC::CRefPtr m_DownloadLeaf; + NLMISC::CRefPtr m_PacketLostLeaf; + NLMISC::CRefPtr m_ServerStateLeaf; + NLMISC::CRefPtr m_ConnectionQualityLeaf; }; diff --git a/code/ryzom/client/src/r2/dmc/com_lua_module.cpp b/code/ryzom/client/src/r2/dmc/com_lua_module.cpp index 80275d280..b91aca95c 100644 --- a/code/ryzom/client/src/r2/dmc/com_lua_module.cpp +++ b/code/ryzom/client/src/r2/dmc/com_lua_module.cpp @@ -77,7 +77,7 @@ CComLuaModule::CComLuaModule(CDynamicMapClient* client, lua_State *luaState /*= #ifdef LUA_NEVRAX_VERSION _LuaState = lua_open(NULL, NULL); #else - _LuaState = lua_open(); + _LuaState = luaL_newstate(); #endif _LuaOwnerShip = false; luaopen_base(_LuaState); @@ -105,7 +105,7 @@ CComLuaModule::CComLuaModule(CDynamicMapClient* client, lua_State *luaState /*= void CComLuaModule::initLuaLib() { //H_AUTO(R2_CComLuaModule_initLuaLib) - const luaL_reg methods[] = + const luaL_Reg methods[] = { {"updateScenario", CComLuaModule::luaUpdateScenario}, {"requestUpdateRtScenario", CComLuaModule::luaRequestUpdateRtScenario}, @@ -237,7 +237,12 @@ void CComLuaModule::initLuaLib() }; int initialStackSize = lua_gettop(_LuaState); +#if LUA_VERSION_NUM >= 502 + luaL_newlib(_LuaState, methods); + lua_setglobal(_LuaState, R2_LUA_PATH); +#else luaL_openlib(_LuaState, R2_LUA_PATH, methods, 0); +#endif lua_settop(_LuaState, initialStackSize); } @@ -1046,7 +1051,11 @@ void CComLuaModule::setObjectToLua(lua_State* state, CObject* object) { int initialStackSize = lua_gettop(state); +#if LUA_VERSION_NUM >= 502 + lua_pushglobaltable(state); // _G +#else lua_pushvalue(state, LUA_GLOBALSINDEX); // _G +#endif lua_pushstring(state, "r2"); // _G, "r2" lua_gettable(state, -2); // G, r2 @@ -1106,6 +1115,8 @@ void CComLuaModule::setObjectToLua(lua_State* state, CObject* object) } } +#if 0 + // okay! if (0) { @@ -1128,6 +1139,7 @@ void CComLuaModule::setObjectToLua(lua_State* state, CObject* object) } } } +#endif } else { @@ -1147,8 +1159,11 @@ CObject* CComLuaModule::getObjectFromLua(lua_State* state, sint idx) { if (lua_getmetatable(state, -1)) { - +#if LUA_VERSION_NUM >= 502 + lua_pushglobaltable(state); // obj, mt, _G +#else lua_pushvalue(state, LUA_GLOBALSINDEX); // obj, mt, _G +#endif lua_pushstring(state, "r2"); // obj, mt, _G, "r2" diff --git a/code/ryzom/client/src/r2/editor.cpp b/code/ryzom/client/src/r2/editor.cpp index bee527bbd..c27001140 100644 --- a/code/ryzom/client/src/r2/editor.cpp +++ b/code/ryzom/client/src/r2/editor.cpp @@ -2613,7 +2613,7 @@ void CEditor::init(TMode initialMode, TAccessMode accessMode) } // CLuaStackChecker lsc(&getLua()); - getLua().pushValue(LUA_GLOBALSINDEX); + getLua().pushGlobalTable(); _Globals.pop(getLua()); getLua().pushValue(LUA_REGISTRYINDEX); _Registry.pop(getLua()); @@ -3956,9 +3956,11 @@ void CEditor::release() // clear the environment if (CLuaManager::getInstance().getLuaState()) { + getLua().pushGlobalTable(); getLua().push(R2_LUA_PATH); getLua().pushNil(); - getLua().setTable(LUA_GLOBALSINDEX); + getLua().setTable(-3); // pop pop + getLua().pop(); _Globals.release(); _Registry.release(); _ObjectProjectionMetatable.release(); // AJM diff --git a/code/ryzom/client/src/r2/tool.cpp b/code/ryzom/client/src/r2/tool.cpp index ddc97fb95..995394b94 100644 --- a/code/ryzom/client/src/r2/tool.cpp +++ b/code/ryzom/client/src/r2/tool.cpp @@ -55,6 +55,7 @@ const uint32 DEFAULT_ENTITY_MIN_OPACITY = 128; bool CTool::_MouseCaptured = false; +NLMISC::CRefPtr CTool::_UserCharFade; static const CVector cardinals[] = { @@ -551,7 +552,8 @@ void CTool::handleMouseOverPlayer(bool over) { //H_AUTO(R2_CTool_handleMouseOverPlayer) // If the mouse is over the player make the player transparent - CCDBNodeLeaf *pNL = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:USER_CHAR_FADE", false); + CCDBNodeLeaf *pNL = _UserCharFade ? &*_UserCharFade + : &*(_UserCharFade = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:USER_CHAR_FADE", false)); if ((pNL != NULL) && (pNL->getValue32() == 1) && UserEntity->selectable()) { // If the nearest entity is the player, hide! diff --git a/code/ryzom/client/src/r2/tool.h b/code/ryzom/client/src/r2/tool.h index f7262efc4..d36c514c1 100644 --- a/code/ryzom/client/src/r2/tool.h +++ b/code/ryzom/client/src/r2/tool.h @@ -284,6 +284,7 @@ private: sint64 _AutoPanDelay; sint64 _NumPans; static bool _MouseCaptured; + static NLMISC::CRefPtr _UserCharFade; private: /** compute the nearest valid surface at a given position from the island heightmap * (heightmap must not be empty or an assertion is raised) diff --git a/code/ryzom/client/src/session_browser_impl.cpp b/code/ryzom/client/src/session_browser_impl.cpp index 5cdd69291..1802aefbf 100644 --- a/code/ryzom/client/src/session_browser_impl.cpp +++ b/code/ryzom/client/src/session_browser_impl.cpp @@ -51,7 +51,7 @@ void CSessionBrowserImpl::init(CLuaState *ls) { nlassert(ls); _Lua = ls; - _Lua->pushValue(LUA_GLOBALSINDEX); + _Lua->pushGlobalTable(); CLuaObject game(*_Lua); game = game["game"]; game.setValue("getRingSessionList", luaGetRingSessionList); @@ -759,7 +759,7 @@ void CSessionBrowserImpl::callRingAccessPointMethod(const char *name, int numArg nlassert(name); { CLuaStackRestorer lsr(_Lua, _Lua->getTop() + numResult); - _Lua->pushValue(LUA_GLOBALSINDEX); + _Lua->pushGlobalTable(); CLuaObject rap(*_Lua); rap = rap["RingAccessPoint"]; rap.callMethodByNameNoThrow(name, numArg, numResult); @@ -774,7 +774,7 @@ void CSessionBrowserImpl::callRingCharTrackingMethod(const char *name, int numAr nlassert(name); { CLuaStackRestorer lsr(_Lua, _Lua->getTop() + numResult); - _Lua->pushValue(LUA_GLOBALSINDEX); + _Lua->pushGlobalTable(); CLuaObject rap(*_Lua); rap = rap["CharTracking"]; rap.callMethodByNameNoThrow(name, numArg, numResult); @@ -789,7 +789,7 @@ void CSessionBrowserImpl::callRingPlayerInfoMethod(const char *name, int numArg, nlassert(name); { CLuaStackRestorer lsr(_Lua, _Lua->getTop() + numResult); - _Lua->pushValue(LUA_GLOBALSINDEX); + _Lua->pushGlobalTable(); CLuaObject rap(*_Lua); rap = rap["RingPlayerInfo"]; rap.callMethodByNameNoThrow(name, numArg, numResult); @@ -804,7 +804,7 @@ void CSessionBrowserImpl::callScenarioScoresMethod(const char *name, int numArg, nlassert(name); { CLuaStackRestorer lsr(_Lua, _Lua->getTop() + numResult); - _Lua->pushValue(LUA_GLOBALSINDEX); + _Lua->pushGlobalTable(); CLuaObject rap(*_Lua); rap = rap["ScenarioScores"]; rap.callMethodByNameNoThrow(name, numArg, numResult); diff --git a/code/ryzom/client/src/weather.cpp b/code/ryzom/client/src/weather.cpp index 1f5f0f822..91fad6f7c 100644 --- a/code/ryzom/client/src/weather.cpp +++ b/code/ryzom/client/src/weather.cpp @@ -194,10 +194,13 @@ bool ServerDrivenWeather = false; const float WEATHER_BLEND_SPEED = 1.f / 8.f; // number of seconds to blend betwen weather states +static NLMISC::CRefPtr s_ServerWeatherValueDB; + // *************************************************************************** static uint16 getServerWeather() { - CCDBNodeLeaf *node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:WEATHER:VALUE"); + CCDBNodeLeaf *node = s_ServerWeatherValueDB ? &*s_ServerWeatherValueDB + : &*(s_ServerWeatherValueDB = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:WEATHER:VALUE")); if (!node) return 0; return (uint16) node->getValue16(); } diff --git a/code/ryzom/common/data_common/database.xml b/code/ryzom/common/data_common/database.xml index fc0d1d209..6157693c6 100644 --- a/code/ryzom/common/data_common/database.xml +++ b/code/ryzom/common/data_common/database.xml @@ -1,1665 +1,1665 @@ - - - - - - - inline void _setProp(CCDBSynchronised &db, - ICDBStructNode *node, TCharConnectionState value, bool - forceSending = false) { db.x_setProp(node, uint64(value), - forceSending); } inline void _getProp(const CCDBSynchronised - &db, ICDBStructNode *node, TCharConnectionState - &value) { value = - (TCharConnectionState)db.x_getProp(node); } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + inline void _setProp(CCDBSynchronised &db, + ICDBStructNode *node, TCharConnectionState value, bool + forceSending = false) { db.x_setProp(node, uint64(value), + forceSending); } inline void _getProp(const CCDBSynchronised + &db, ICDBStructNode *node, TCharConnectionState + &value) { value = + (TCharConnectionState)db.x_getProp(node); } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/ryzom/common/data_common/msg.xml b/code/ryzom/common/data_common/msg.xml index 3fa75650e..df2011edf 100644 --- a/code/ryzom/common/data_common/msg.xml +++ b/code/ryzom/common/data_common/msg.xml @@ -1,1165 +1,1165 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/ryzom/common/src/game_share/crypt.cpp b/code/ryzom/common/src/game_share/crypt.cpp index fa0f1252f..0da908817 100644 --- a/code/ryzom/common/src/game_share/crypt.cpp +++ b/code/ryzom/common/src/game_share/crypt.cpp @@ -79,6 +79,10 @@ static char rz_sccsid[] = "@(#)crypt.c 8.1 (Berkeley) 6/4/93"; #include #define RZ__PASSWORD_EFMT1 '-' +#if DEBUG_CRYPT +void prtab(char *s, unsigned char *t, int num_rows); +#endif + /* * UNIX password, and DES, encryption. * By Tom Truscott, trt@rti.rti.org, @@ -785,7 +789,7 @@ int rz_des_cipher(const char *in, char *out, long salt, int num_iter) { } perm[i] = (unsigned char) k; } -#ifdef DEBUG +#ifdef DEBUG_CRYPT prtab("pc1tab", perm, 8); #endif rz_init_perm(PC1ROT, perm, 8, 8); @@ -809,7 +813,7 @@ int rz_des_cipher(const char *in, char *out, long salt, int num_iter) { if ((k%28) <= j) k -= 28; perm[i] = pc2inv[k]; } -#ifdef DEBUG +#ifdef DEBUG_CRYPT prtab("pc2tab", perm, 8); #endif rz_init_perm(PC2ROT[j], perm, 8, 8); @@ -833,7 +837,7 @@ int rz_des_cipher(const char *in, char *out, long salt, int num_iter) { perm[i*8+j] = (unsigned char) k; } } -#ifdef DEBUG +#ifdef DEBUG_CRYPT prtab("ietab", perm, 8); #endif rz_init_perm(IE3264, perm, 4, 8); @@ -850,7 +854,7 @@ int rz_des_cipher(const char *in, char *out, long salt, int num_iter) { } perm[k-1] = i+1; } -#ifdef DEBUG +#ifdef DEBUG_CRYPT prtab("cftab", perm, 8); #endif rz_init_perm(CF6464, perm, 8, 8); @@ -959,12 +963,8 @@ int rz_encrypt(register char *block, int flag) { return (0); } -#ifdef DEBUG -STATIC -prtab(s, t, num_rows) - char *s; - unsigned char *t; - int num_rows; +#ifdef DEBUG_CRYPT +void prtab(char *s, unsigned char *t, int num_rows) { register int i, j; diff --git a/code/ryzom/server/src/CMakeLists.txt b/code/ryzom/server/src/CMakeLists.txt index 13cee545a..29c11be09 100644 --- a/code/ryzom/server/src/CMakeLists.txt +++ b/code/ryzom/server/src/CMakeLists.txt @@ -1,7 +1,14 @@ + # Supporting modules and libraries. -ADD_SUBDIRECTORY(admin_modules) +# Need servershare for build packed collision tool +# Need aishare for build wmap tool ADD_SUBDIRECTORY(server_share) ADD_SUBDIRECTORY(ai_share) + +IF(WITH_RYZOM_SERVER) + +# Supporting modules and libraries. +ADD_SUBDIRECTORY(admin_modules) ADD_SUBDIRECTORY(gameplay_module_lib) ADD_SUBDIRECTORY(pd_lib) @@ -40,3 +47,5 @@ ADD_SUBDIRECTORY(general_utilities_service) #sabrina #simulation_service #testing_tool_service + +ENDIF(WITH_RYZOM_SERVER) diff --git a/code/ryzom/tools/CMakeLists.txt b/code/ryzom/tools/CMakeLists.txt index 247e75415..456336254 100644 --- a/code/ryzom/tools/CMakeLists.txt +++ b/code/ryzom/tools/CMakeLists.txt @@ -9,15 +9,13 @@ ADD_SUBDIRECTORY(leveldesign) ADD_SUBDIRECTORY(patch_gen) ADD_SUBDIRECTORY(pdr_util) ADD_SUBDIRECTORY(stats_scan) +ADD_SUBDIRECTORY(sheets_packer) IF(WITH_RYZOM_CLIENT) - ADD_SUBDIRECTORY(sheets_packer) ADD_SUBDIRECTORY(client) ENDIF(WITH_RYZOM_CLIENT) -IF(WITH_RYZOM_SERVER) - ADD_SUBDIRECTORY(server) -ENDIF(WITH_RYZOM_SERVER) +ADD_SUBDIRECTORY(server) # Old stuff that doesn't compile anymore. #ADD_SUBDIRECTORY(occ2huff) diff --git a/code/ryzom/tools/build_gamedata/workspace/ecosystems/desert/directories.py b/code/ryzom/tools/build_gamedata/workspace/ecosystems/desert/directories.py index e15b856f2..0a0534f1c 100644 --- a/code/ryzom/tools/build_gamedata/workspace/ecosystems/desert/directories.py +++ b/code/ryzom/tools/build_gamedata/workspace/ecosystems/desert/directories.py @@ -206,6 +206,7 @@ ZoneExportDirectory = CommonPath + "/zone" # PACS primitives directories PacsPrimExportDirectory = CommonPath + "/pacs_prim" +PacsPrimTagExportDirectory = CommonPath + "/pacs_prim_tag" # *** BUILD DIRECTORIES FOR THE BUILD PIPELINE *** diff --git a/code/ryzom/tools/build_gamedata/workspace/ecosystems/jungle/directories.py b/code/ryzom/tools/build_gamedata/workspace/ecosystems/jungle/directories.py index 1ceface1c..716afc247 100644 --- a/code/ryzom/tools/build_gamedata/workspace/ecosystems/jungle/directories.py +++ b/code/ryzom/tools/build_gamedata/workspace/ecosystems/jungle/directories.py @@ -210,6 +210,7 @@ ZoneExportDirectory = CommonPath + "/zone" # PACS primitives directories PacsPrimExportDirectory = CommonPath + "/pacs_prim" +PacsPrimTagExportDirectory = CommonPath + "/pacs_prim_tag" # *** BUILD DIRECTORIES FOR THE BUILD PIPELINE *** diff --git a/code/ryzom/tools/build_gamedata/workspace/ecosystems/lacustre/directories.py b/code/ryzom/tools/build_gamedata/workspace/ecosystems/lacustre/directories.py index af2e15e29..37e35b51e 100644 --- a/code/ryzom/tools/build_gamedata/workspace/ecosystems/lacustre/directories.py +++ b/code/ryzom/tools/build_gamedata/workspace/ecosystems/lacustre/directories.py @@ -218,6 +218,7 @@ ZoneExportDirectory = CommonPath + "/zone" # PACS primitives directories PacsPrimExportDirectory = CommonPath + "/pacs_prim" +PacsPrimTagExportDirectory = CommonPath + "/pacs_prim_tag" # *** BUILD DIRECTORIES FOR THE BUILD PIPELINE *** diff --git a/code/ryzom/tools/build_gamedata/workspace/ecosystems/primes_racines/directories.py b/code/ryzom/tools/build_gamedata/workspace/ecosystems/primes_racines/directories.py index d49e8d06b..c718e90ec 100644 --- a/code/ryzom/tools/build_gamedata/workspace/ecosystems/primes_racines/directories.py +++ b/code/ryzom/tools/build_gamedata/workspace/ecosystems/primes_racines/directories.py @@ -203,6 +203,7 @@ ZoneExportDirectory = CommonPath + "/zone" # PACS primitives directories PacsPrimExportDirectory = CommonPath + "/pacs_prim" +PacsPrimTagExportDirectory = CommonPath + "/pacs_prim_tag" # *** BUILD DIRECTORIES FOR THE BUILD PIPELINE *** diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/assigned.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/assigned.php new file mode 100644 index 000000000..6d2a558c3 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/assigned.php @@ -0,0 +1,120 @@ +set(array('User' => $user_id, 'Ticket' => $ticket_id)); + $assignation->create(); + return "SUCCESS_ASSIGNED"; + }else{ + return "ALREADY_ASSIGNED"; + } + + } + + //Unsign a ticket to a user or returns error message + public static function unAssignTicket( $user_id, $ticket_id) { + $dbl = new DBLayer("lib"); + //check if ticket is really assigned to that user + if( Assigned::isAssigned($ticket_id, $user_id)){ + $assignation = new Assigned(); + $assignation->set(array('User' => $user_id, 'Ticket' => $ticket_id)); + $assignation->delete(); + return "SUCCESS_UNASSIGNED"; + }else{ + return "NOT_ASSIGNED"; + } + + } + + // Get the id of the user assigned to a ticket + public static function getUserAssignedToTicket($ticket_id) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT ticket_user.ExternId FROM `assigned` JOIN `ticket_user` ON assigned.User = ticket_user.TUserId WHERE `Ticket` = :ticket_id", Array('ticket_id' => $ticket_id)); + $user_id = $statement->fetch(); + return $user_id['ExternId']; + + + + } + + public static function isAssigned( $ticket_id, $user_id = 0) { + $dbl = new DBLayer("lib"); + //check if ticket is already assigned + + if($user_id == 0 && $dbl->execute(" SELECT * FROM `assigned` WHERE `Ticket` = :ticket_id", array('ticket_id' => $ticket_id) )->rowCount() ){ + return true; + }else if( $dbl->execute(" SELECT * FROM `assigned` WHERE `Ticket` = :ticket_id and `User` = :user_id", array('ticket_id' => $ticket_id, 'user_id' => $user_id) )->rowCount()){ + return true; + }else{ + return false; + } + } + + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// + + public function __construct() { + } + + //set values + public function set($values) { + $this->setUser($values['User']); + $this->setTicket($values['Ticket']); + } + + public function create() { + $dbl = new DBLayer("lib"); + $query = "INSERT INTO `assigned` (`User`,`Ticket`) VALUES (:user, :ticket)"; + $values = Array('user' => $this->getUser(), 'ticket' => $this->getTicket()); + $dbl->execute($query, $values); + } + + //delete entry + public function delete() { + $dbl = new DBLayer("lib"); + $query = "DELETE FROM `assigned` WHERE `User` = :user_id and `Ticket` = :ticket_id"; + $values = array('user_id' => $this->getUser() ,'ticket_id' => $this->getTicket()); + $dbl->execute($query, $values); + } + + //Load with sGroupId + public function load( $user_id, $user_id) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT * FROM `assigned` WHERE `Ticket` = :ticket_id AND `User` = :user_id", Array('ticket_id' => $ticket_id, 'user_id' => $user_id)); + $row = $statement->fetch(); + $this->set($row); + } + + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getUser(){ + return $this->user; + } + + public function getTicket(){ + return $this->ticket; + } + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setUser($u){ + $this->user = $u; + } + + public function setTicket($g){ + $this->ticket = $g; + } + + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/dblayer.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/dblayer.php index a96fd98ea..c5b7375c3 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/dblayer.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/dblayer.php @@ -5,53 +5,39 @@ class DBLayer{ function __construct($db) { - try{ - $dsn = "mysql:"; - $dsn .= "host=". $db['host'].";"; - $dsn .= "dbname=". $db['name'].";"; - $dsn .= "port=". $db['port'].";"; - - $opt = array( - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC - ); - $this->PDO = new PDO($dsn,$db['user'],$db['pass'], $opt); - }catch (PDOException $e) { - throw $e; - } + global $cfg; + $dsn = "mysql:"; + $dsn .= "host=". $cfg['db'][$db]['host'].";"; + $dsn .= "dbname=". $cfg['db'][$db]['name'].";"; + $dsn .= "port=". $cfg['db'][$db]['port'].";"; + + $opt = array( + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC + ); + $this->PDO = new PDO($dsn,$cfg['db'][$db]['user'],$cfg['db'][$db]['pass'], $opt); + } public function executeWithoutParams($query){ - try{ - $statement = $this->PDO->prepare($query); - $statement->execute(); - return $statement; - }catch (PDOException $e) { - throw $e; - } + $statement = $this->PDO->prepare($query); + $statement->execute(); + return $statement; } public function execute($query,$params){ - try{ - $statement = $this->PDO->prepare($query); - $statement->execute($params); - return $statement; - }catch (PDOException $e) { - throw $e; - } + $statement = $this->PDO->prepare($query); + $statement->execute($params); + return $statement; } public function executeReturnId($query,$params){ - try{ - $statement = $this->PDO->prepare($query); - $this->PDO->beginTransaction(); - $statement->execute($params); - $lastId =$this->PDO->lastInsertId(); - $this->PDO->commit(); - return $lastId; - }catch (PDOException $e) { - throw $e; - } + $statement = $this->PDO->prepare($query); + $this->PDO->beginTransaction(); + $statement->execute($params); + $lastId =$this->PDO->lastInsertId(); + $this->PDO->commit(); + return $lastId; } } \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/forwarded.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/forwarded.php new file mode 100644 index 000000000..003811fe9 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/forwarded.php @@ -0,0 +1,98 @@ +load($ticket_id); + $forw->delete(); + } + $forward = new Forwarded(); + $forward->set(array('Group' => $group_id, 'Ticket' => $ticket_id)); + $forward->create(); + return "SUCCESS_FORWARDED"; + + } + + public static function getSGroupOfTicket($ticket_id) { + $forw = new self(); + $forw->load($ticket_id); + return $forw->getGroup(); + } + + + public static function isForwarded( $ticket_id) { + $dbl = new DBLayer("lib"); + if( $dbl->execute(" SELECT * FROM `forwarded` WHERE `Ticket` = :ticket_id", array('ticket_id' => $ticket_id))->rowCount()){ + return true; + }else{ + return false; + } + + } + + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// + + public function __construct() { + } + + //set values + public function set($values) { + $this->setGroup($values['Group']); + $this->setTicket($values['Ticket']); + } + + public function create() { + $dbl = new DBLayer("lib"); + $query = "INSERT INTO `forwarded` (`Group`,`Ticket`) VALUES (:group, :ticket)"; + $values = Array('group' => $this->getGroup(), 'ticket' => $this->getTicket()); + $dbl->execute($query, $values); + } + + //delete entry + public function delete() { + $dbl = new DBLayer("lib"); + $query = "DELETE FROM `forwarded` WHERE `Group` = :group_id and `Ticket` = :ticket_id"; + $values = array('group_id' => $this->getGroup() ,'ticket_id' => $this->getTicket()); + $dbl->execute($query, $values); + } + + //Load with sGroupId + public function load( $ticket_id) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT * FROM `forwarded` WHERE `Ticket` = :ticket_id", Array('ticket_id' => $ticket_id)); + $row = $statement->fetch(); + $this->set($row); + } + + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getGroup(){ + return $this->group; + } + + public function getTicket(){ + return $this->ticket; + } + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setGroup($g){ + $this->group = $g; + } + + public function setTicket($t){ + $this->ticket = $t; + } + + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/gui_elements.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/gui_elements.php new file mode 100644 index 000000000..cb932afe5 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/gui_elements.php @@ -0,0 +1,79 @@ +', $function); + $intermediate_result = NULL; + foreach($fnames as $fname) { + if(substr($fname, -2) == "()") { + $fname = substr($fname, 0, strlen($fname)-2); + if($intermediate_result == NULL) { + $intermediate_result = $element->$fname(); + } else { + $intermediate_result = $intermediate_result->$fname(); + } + } else { + if($intermediate_result == NULL) { + $intermediate_result = $element->$fname(); + } else { + $intermediate_result = $intermediate_result->$fname(); + } + } + } + $result[$i][$fieldArray[$j]] = $intermediate_result; + $j++; + } + $i++; + } + return $result; + } + + + public static function make_table_with_key_is_id( $inputList, $funcArray, $idFunction){ + $result = Array(); + foreach($inputList as $element){ + foreach($funcArray as $function){ + $result[$element->$idFunction()] = $element->$function(); + } + } + return $result; + } + + + public static function time_elapsed_string($ptime){ + global $TIME_FORMAT; + $ptime = DateTime::createFromFormat($TIME_FORMAT, $ptime)->getTimestamp(); + + $etime = time() - $ptime; + + if ($etime < 1) + { + return '0 seconds'; + } + + $a = array( 12 * 30 * 24 * 60 * 60 => 'year', + 30 * 24 * 60 * 60 => 'month', + 24 * 60 * 60 => 'day', + 60 * 60 => 'hour', + 60 => 'minute', + 1 => 'second' + ); + + foreach ($a as $secs => $str) + { + $d = $etime / $secs; + if ($d >= 1) + { + $r = round($d); + return $r . ' ' . $str . ($r > 1 ? 's' : '') . ' ago'; + } + } + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/helpers.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/helpers.php index 0bc4197b3..233f44510 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/helpers.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/helpers.php @@ -6,6 +6,7 @@ class Helpers{ global $AMS_LIB; global $SITEBASE; global $AMS_TRANS; + global $INGAME_LAYOUT; require_once $AMS_LIB . '/smarty/libs/Smarty.class.php'; $smarty = new Smarty; @@ -17,55 +18,39 @@ class Helpers{ helpers :: create_folders (); - if ( helpers :: check_if_game_client () or $forcelibrender = false ){ + if ( helpers::check_if_game_client() or $forcelibrender = false ){ $smarty -> template_dir = $AMS_LIB . '/ingame_templates/'; $smarty -> setConfigDir( $AMS_LIB . '/configs' ); - }else{ + $variables = parse_ini_file( $AMS_LIB . '/configs/ingame_layout.ini', true ); + foreach ( $variables[$INGAME_LAYOUT] as $key => $value ){ + $smarty -> assign( $key, $value ); + } + }else{ $smarty -> template_dir = $SITEBASE . '/templates/'; $smarty -> setConfigDir( $SITEBASE . '/configs' ); - } + } foreach ( $vars as $key => $value ){ $smarty -> assign( $key, $value ); } - global $DEFAULT_LANGUAGE; - //if language get param is given = set cookie - //else if no get param is given and a cookie is set, use that language, else use default. - if ( isset( $_GET['language'] ) ) { - //check if the language is supported - if ( file_exists( $AMS_TRANS . '/' . $_GET['language'] . '.ini' ) ){ - //if it's supported, set cookie! - setcookie( 'language',$_GET['language'], time() + 60*60*24*30 ); - $language = $_GET['language']; - }else{ - //the language is not supported, use the default. - $language = $DEFAULT_LANGUAGE; - } - }else{ - //if no get param is given, check if a cookie value for language is set - if ( isset( $_COOKIE['language'] ) ) { - $language = $_COOKIE['language']; - } - //else use the default - else{ - $language = $DEFAULT_LANGUAGE; - } - } - - $variables = parse_ini_file( $AMS_TRANS . '/' . $language . '.ini', true ); + + $variables = Helpers::handle_language(); foreach ( $variables[$template] as $key => $value ){ $smarty -> assign( $key, $value ); } - if( isset($vars['permission']) && $vars['permission'] == 2 ){ + + if( isset($vars['permission']) && $vars['permission'] == 3 ){ $inherited = "extends:layout_admin.tpl|"; + }else if( isset($vars['permission']) && $vars['permission'] == 2){ + $inherited = "extends:layout_mod.tpl|"; }else if( isset($vars['permission']) && $vars['permission'] == 1){ $inherited = "extends:layout_user.tpl|"; }else{ $inherited =""; } - // extends:' . $inherited .'|register.tpl - $smarty -> display( $inherited . $template . '.tpl' ); + // extends:' . $inherited .'|register.tpl + $smarty -> display( $inherited . $template . '.tpl' ); } static public function create_folders(){ @@ -91,11 +76,68 @@ class Helpers{ static public function check_if_game_client() { // if HTTP_USER_AGENT is not set then its ryzom core - if ( !isset( $_SERVER['HTTP_USER_AGENT'] ) ){ + if ( strpos($_SERVER['HTTP_USER_AGENT'],"Ryzom") === 0){ return true; - }else{ + }else{ return false; } - } } - + + static public function handle_language(){ + global $DEFAULT_LANGUAGE; + global $AMS_TRANS; + + //if language get param is given = set cookie + //else if no get param is given and a cookie is set, use that language, else use default. + if ( isset( $_GET['language'] ) ) { + //check if the language is supported + if ( file_exists( $AMS_TRANS . '/' . $_GET['language'] . '.ini' ) ){ + //if it's supported, set cookie! + setcookie( 'language',$_GET['language'], time() + 60*60*24*30 ); + $language = $_GET['language']; + }else{ + //the language is not supported, use the default. + $language = $DEFAULT_LANGUAGE; + } + }else{ + //if no get param is given, check if a cookie value for language is set + if ( isset( $_COOKIE['language'] ) ) { + $language = $_COOKIE['language']; + } + //else use the default + else{ + $language = $DEFAULT_LANGUAGE; + } + } + + return parse_ini_file( $AMS_TRANS . '/' . $language . '.ini', true ); + } + + + //Time output function for handling the time display function. + static public function outputTime($time){ + global $TIME_FORMAT; + return date($TIME_FORMAT,strtotime($time)); + } + + static public function check_login_ingame(){ + if ( helpers :: check_if_game_client () or $forcelibrender = false ){ + $dbr = new DBLayer("ring"); + if (isset($_GET['UserId']) && isset($_COOKIE['ryzomId'])){ + $id = $_GET['UserId']; + $statement = $dbr->execute("SELECT * FROM ring_users WHERE user_id=:id AND cookie =:cookie", array('id' => $id, 'cookie' => $_COOKIE['ryzomId'])); + if ($statement->rowCount() ){ + $entry = $statement->fetch(); + //print_r($entry); + return array('id' => $entry['user_id'], 'name' => $entry['user_name']); + }else{ + return "FALSE"; + } + }else{ + return "FALSE"; + } + }else{ + return "FALSE"; + } + } +} diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/in_support_group.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/in_support_group.php new file mode 100644 index 000000000..b01517db2 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/in_support_group.php @@ -0,0 +1,77 @@ +execute(" SELECT * FROM `in_support_group` WHERE `User` = :user_id and `Group` = :group_id ", array('user_id' => $user_id, 'group_id' => $group_id) )->rowCount() ){ + return true; + }else{ + return false; + } + } + + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// + + public function __construct() { + } + + //set values + public function set($values) { + $this->setUser($values['User']); + $this->setGroup($values['Group']); + } + + public function create() { + $dbl = new DBLayer("lib"); + $query = "INSERT INTO `in_support_group` (`User`,`Group`) VALUES (:user, :group)"; + $values = Array('user' => $this->user, 'group' => $this->group); + $dbl->execute($query, $values); + } + + //delete entry + public function delete() { + $dbl = new DBLayer("lib"); + $query = "DELETE FROM `in_support_group` WHERE `User` = :user_id and `Group` = :group_id"; + $values = array('user_id' => $this->getUser() ,'group_id' => $this->getGroup()); + $dbl->execute($query, $values); + } + + //Load with sGroupId + public function load( $user_id, $group_id) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT * FROM `in_support_group` WHERE `Group` = :group_id", Array('group_id' => $group_id)); + $row = $statement->fetch(); + $this->set($row); + } + + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getUser(){ + return $this->user; + } + + public function getGroup(){ + return $this->group; + } + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setUser($u){ + $this->user = $u; + } + + public function setGroup($g){ + $this->group = $g; + } + + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php new file mode 100644 index 000000000..4c5e14caf --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php @@ -0,0 +1,378 @@ + getTId() . " ----------\n You received a new reply on your ticket: " . $ticketObj->getTitle() . + "\n --------------------\n\n"; + $subject = "New reply on [Ticket #" . $ticketObj->getTId() ."]"; + $endTxt = "\n\n----------\nYou can reply on this message to answer directly on the ticket!"; + $txt = $txt . $content . $endTxt; + self::send_mail($ticketObj->getAuthor(),$subject,$txt, $ticketObj->getTId(),$author); + }else if($type == "NEW"){ + $txt = "---------- Ticket #". $ticketObj->getTId() . " ----------\n Your ticket: " . $ticketObj->getTitle() . " is newly created"; + if($ticketObj->getAuthor() != $author){ + $txt = $txt . " by " . Ticket_User::get_username_from_id($author); + }else{ + $author = $ticketObj->getAuthor(); + } + $txt = $txt . "\n --------------------\n\n"; + $subject = "New ticket created [Ticket #" . $ticketObj->getTId() ."]"; + $endTxt = "\n\n----------\nYou can reply on this message to answer directly on the ticket!"; + $txt = $txt . $content . $endTxt; + self::send_mail($ticketObj->getAuthor(),$subject,$txt, $ticketObj->getTId()); + } + + } + } + + + public static function send_mail($recipient, $subject, $body, $ticket_id = 0, $from = 1) { + if(is_numeric($recipient)) { + $id_user = $recipient; + $recipient = NULL; + } + $query = "INSERT INTO email (Recipient,Subject,Body,Status,Attempts,Sender,UserId,MessageId,TicketId) VALUES (:recipient, :subject, :body, :status, :attempts, :sender, :id_user, :messageId, :ticketId)"; + $values = array('recipient' => $recipient, 'subject' => $subject, 'body' => $body, 'status' => 'NEW', 'attempts'=> 0, 'sender' => $from,'id_user' => $id_user, 'messageId' => 0, 'ticketId'=> $ticket_id); + $db = new DBLayer("lib"); + $db->execute($query, $values); + + } + + + //the main function + function cron() { + global $cfg; + $inbox_username = $cfg['mail']['username']; + $inbox_password = $cfg['mail']['password']; + $inbox_host = $cfg['mail']['host']; + $oms_reply_to = "Ryzom Ticketing Support "; + global $MAIL_DIR; + + // Deliver new mail + echo("mail cron\n"); + + //creates child process + $pid = self::mail_fork(); + $pidfile = '/tmp/ams_cron_email_pid'; + + //INFO: if $pid = + //-1: "Could not fork!\n"; + // 0: "In child!\n"; + //>0: "In parent!\n"; + + if($pid) { + + // We're the parent process, do nothing! + + } else { + //make db connection here because the children have to make the connection. + $this->db = new DBLayer("lib"); + + //if $pidfile doesn't exist yet, then start sending the mails that are in the db. + if(!file_exists($pidfile)) { + //create the file and write the child processes id in it! + $pid = getmypid(); + $file = fopen($pidfile, 'w'); + fwrite($file, $pid); + fclose($file); + + //select all new & failed emails & try to send them + //$emails = db_query("select * from email where status = 'NEW' or status = 'FAILED'"); + $statement = $this->db->executeWithoutParams("select * from email where Status = 'NEW' or Status = 'FAILED'"); + $emails = $statement->fetchAll(); + + foreach($emails as $email) { + $message_id = self::new_message_id($email['TicketId']); + + //if recipient isn't given, then use the email of the id_user instead! + echo("Emailing {$email['Recipient']}\n"); + if(!$email['Recipient']) { + $email['Recipient'] = Ticket_User::get_email_by_user_id($email['UserId']); + } + + //create sending email adres based on the $sender id + if($email['Sender'] != 0) { + $username = Ticket_User::get_username_from_id($email['Sender']); + $from = "$username <$username@$inbox_host>"; + } else { + $from = $oms_reply_to; + } + $headers = "From: $from\r\n" . "Message-ID: " . $message_id ; + print("recip: " . $email['Recipient']); + print("subj: " .$email['Subject']); + print("body: " . $email['Body']); + print("headers: " . $headers); + if(mail($email['Recipient'], $email['Subject'], $email['Body'], $headers)) { + $status = "DELIVERED"; + echo("Emailed {$email['Recipient']}\n"); + } else { + $status = "FAILED"; + echo("Email to {$email['Recipient']} failed\n"); + } + //change the status of the emails. + $this->db->execute('update email set Status = ?, MessageId = ?, Attempts = Attempts + 1 where MailId = ?', array($status, $message_id, $email['MailId'])); + //db_exec('update email set status = ?, message_id = ?, attempts = attempts + 1 where id_email = ?', array($status, $message_id, $email['id_email'])); + } + unlink($pidfile); + } + // Check mail + + //$mailbox = imap_open("{localhost:110/pop3/novalidate-cert}INBOX", $inbox_username, $inbox_password); + $mbox = imap_open($cfg['mail']['server'], $inbox_username, $inbox_password) or die('Cannot connect to mail server: ' . imap_last_error()); + $message_count = imap_num_msg($mbox); + + for ($i = 1; $i <= $message_count; ++$i) { + + //return task ID + self::incoming_mail_handler($mbox, $i); + $tid = 1; //self::ams_create_email($from, $subject, $txt, $html, $to, $from); + + if($tid) { + //TODO: base file on Ticket + reply id + /* $file = fopen($MAIL_DIR."/mail/".$tid, 'w'); + fwrite($file, $entire_email); + fclose($file); */ + } + //mark message $i of $mbox for deletion! + imap_delete($mbox, $i); + } + //delete marked messages + imap_expunge($mbox); + imap_close($mbox); + + } + + } + + + + function new_message_id($ticketId) { + $time = time(); + $pid = getmypid(); + global $cfg; + global $ams_mail_count; + $ams_mail_count = ($ams_mail_count == '') ? 1 : $ams_mail_count + 1; + return ""; + + } + + function get_ticket_id_from_subject($subject){ + $startpos = strpos($subject, "[Ticket #"); + $tempString = substr($subject, $startpos+9); + $endpos = strpos($tempString, "]"); + $ticket_id = substr($tempString, 0, $endpos); + return $ticket_id; + } + + + function incoming_mail_handler($mbox,$i){ + + $header = imap_header($mbox, $i); + $subject = self::decode_utf8($header->subject); + + print_r($header); + + //get ticket_id out of the message-id or else out of the subject line + $ticket_id = 0; + if(isset($header->references)){ + $pieces = explode(".", $header->references); + if($pieces[0] == "subject); + $to = $header->to[0]->mailbox; + $from = $header->from[0]->mailbox . '@' . $header->from[0]->host; + $txt = self::get_part($mbox, $i, "TEXT/PLAIN"); + //$html = self::get_part($mbox, $i, "TEXT/HTML"); + + //use the line ---------- Ticket # to make a distincton between the old message and the reply + $endpos = strpos($txt, ">---------- Ticket #"); + if($endpos){ + $txt = substr($txt, 0, $endpos); + }else{ + $endpos = strpos($txt, "---------- Ticket #"); + if($endpos){ + $txt = substr($txt, 0, $endpos); + } + } + + + //get the id out of the email address of the person sending the email. + if($from !== NULL && !is_numeric($from)) $from = Ticket_User::get_id_from_email($from); + + $user = new Ticket_User(); + $user->load_With_TUserId($from); + $ticket = new Ticket(); + $ticket->load_With_TId($ticket_id); + + //if user has access to it! + if((Ticket_User::isMod($user) or ($ticket->getAuthor() == $user->getTUserId())) and $txt != ""){ + Ticket::createReply($txt, $user->getTUserId(), $ticket->getTId(), 0); + } + + } + + } + + /*function ams_create_email($from, $subject, $body, $html, $recipient = 0, $sender = NULL) { + + //TODO: + if($recipient == 0 && !is_string($recipient)) { + global $user; + $recipient = $user->uid; + } + + if($sender !== NULL && !is_numeric($sender)) $sender = self::get_id_from_username($sender); + if(!is_numeric($recipient)) $recipient = self::get_id_from_username($recipient); + + $message = array( + 'creator' => $sender, + 'owner' => $recipient, + 'type' => 'email', + 'summary' => $subject, + 'data' => array ( + 'subject' => $subject, + 'body' => $body, + 'html' => $html, + 'sender' => oms_get_username_from_id($sender), + 'from' => $from, + 'recipient' => oms_get_username_from_id($recipient), + 'time' => time(), + ), + ); + + //TO ASK: + oms_task_create($message); + oms_task_index($message, array('subject', 'body', 'sender', 'recipient')); + //--------------------------- + return $message['id_task']; + }*/ + + + + /*function oms_get_email($id) { + + $message = oms_task_load($id); + if($message) { + oms_prepare_email($message); + return $message; + } else { + return FALSE; + } + + }*/ + + + + /*function oms_prepare_email(&$message) { + + $data = $message['data']; + $data['id_message'] = $message['id_task']; + $data['read'] = ($message['status'] != 'NEW' && $message['status'] != 'UNREAD'); + $message = $data; + + }*/ + + + + /*function oms_email_mark_read($mid) { + + db_exec("update task set status = 'READ' where id_task = ? and type = 'email' and module = 'email'", array($mid)); + + }*/ + + + + function decode_utf8($str) { + + preg_match_all("/=\?UTF-8\?B\?([^\?]+)\?=/i",$str, $arr); + for ($i=0;$isubtype) { + return $primary_mime_type[(int) $structure->type] . '/' .$structure->subtype; + } + return "TEXT/PLAIN"; + + } + + + + function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) { + + if(!$structure) { + $structure = imap_fetchstructure($stream, $msg_number); + } + + if($structure) { + if($mime_type == self::get_mime_type($structure)) { + if(!$part_number) { + $part_number = "1"; + } + $text = imap_fetchbody($stream, $msg_number, $part_number); + if($structure->encoding == 3) { + return imap_base64($text); + } else if($structure->encoding == 4) { + return imap_qprint($text); + } else { + return $text; + } + } + + if($structure->type == 1) /* multipart */ { + while(list($index, $sub_structure) = each($structure->parts)) { + if($part_number) { + $prefix = $part_number . '.'; + } else { + $prefix = ''; + } + $data = self::get_part($stream, $msg_number, $mime_type, $sub_structure,$prefix . ($index + 1)); + if($data) { + return $data; + } + } // END OF WHILE + } // END OF MULTIPART + } // END OF STRUTURE + return false; + + } // END OF FUNCTION + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/pagination.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/pagination.php new file mode 100644 index 000000000..3c4473170 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/pagination.php @@ -0,0 +1,97 @@ +current= 1; + }else{ + $this->current= $_GET['pagenum']; + } + + //Here we count the number of results + $db = new DBLayer($db); + $rows = $db->execute($query, $params)->rowCount(); + $this->amountOfRows = $rows; + //the array hat will contain all users + + if($rows > 0){ + //This is the number of results displayed per page + $page_rows = $nrDisplayed; + + //This tells us the page number of our last page + $this->last = ceil($rows/$page_rows); + + //this makes sure the page number isn't below one, or more than our maximum pages + if ($this->current< 1) + { + $this->current= 1; + }else if ($this->current> $this->last) { + $this->current= $this->last; + } + + //This sets the range to display in our query + $max = 'limit ' .($this->current- 1) * $page_rows .',' .$page_rows; + + //This is your query again, the same one... the only difference is we add $max into it + $data = $db->execute($query . " " . $max, $params); + + $this->element_array = Array(); + //This is where we put the results in a resultArray to be sent to smarty + while($row = $data->fetch(PDO::FETCH_ASSOC)){ + $element = new $resultClass(); + $element->set($row); + $this->element_array[] = $element; + } + } + } + + + public function getLast(){ + return $this->last; + } + + public function getCurrent(){ + return $this->current; + } + + public function getElements(){ + return $this->element_array; + } + + public function getAmountOfRows(){ + return $this->amountOfRows; + } + + public function getLinks($nrOfLinks){ + $pageLinks = Array(); + //if amount of showable links is greater than the amount of pages: show all! + if ($this->last <= $nrOfLinks){ + for($var = 1; $var <= $this->last; $var++){ + $pageLinks[] = $var; + } + }else{ + $offset = ($nrOfLinks-1)/2 ; + $startpoint = $this->current - $offset; + $endpoint = $this->current + $offset; + + if($startpoint < 1){ + $startpoint = 1; + $endpoint = $startpoint + $nrOfLinks - 1; + }else if($endpoint > $this->last){ + $endpoint = $this->last; + $startpoint = $endpoint - ($nrOfLinks -1); + } + + for($var = $startpoint; $var <= $endpoint; $var++){ + $pageLinks[] = $var; + } + } + return $pageLinks; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/querycache.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/querycache.php new file mode 100644 index 000000000..9ca6c627d --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/querycache.php @@ -0,0 +1,83 @@ +setSID($values['SID']); + $this->setType($values['type']); + $this->setQuery($values['query']); + $this->setDb($values['db']); + } + + + //return constructed element based on SID + public function load_With_SID( $id) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT * FROM ams_querycache WHERE SID=:id", array('id' => $id)); + $row = $statement->fetch(); + $this->set($row); + } + + + //update private data to DB. + public function update(){ + $dbl = new DBLayer("lib"); + $query = "UPDATE ams_querycache SET type= :t, query = :q, db = :d WHERE SID=:id"; + $values = Array('id' => $this->getSID(), 't' => $this->getType(), 'q' => $this->getQuery(), 'd' => $this->getDb()); + $statement = $dbl->execute($query, $values); + } + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getSID(){ + return $this->SID; + } + + + public function getType(){ + return $this->type; + } + + + public function getQuery(){ + return $this->query; + } + + public function getDb(){ + return $this->db; + } + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setSID($s){ + $this->SID = $s; + } + + + public function setType($t){ + $this->type = $t; + } + + public function setQuery($q){ + $this->query= $q; + } + + public function setDb($d){ + $this->db= $d; + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sql.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sql.php deleted file mode 100644 index 609ed8740..000000000 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sql.php +++ /dev/null @@ -1,10 +0,0 @@ -execute("SELECT * FROM support_group WHERE SGroupId = :id", array('id' => $id)); + $row = $statement->fetch(); + $instanceGroup = new self(); + $instanceGroup->set($row); + return $instanceGroup; + + } + + //return all groups + public static function getGroups() { + $dbl = new DBLayer("lib"); + $statement = $dbl->executeWithoutParams("SELECT * FROM support_group ORDER BY Name ASC"); + $rows = $statement->fetchAll(); + $result = Array(); + foreach($rows as $group){ + + $instanceGroup = new self(); + $instanceGroup->set($group); + $result[] = $instanceGroup; + } + return $result; + } + + //wrapper for creating a support group + public static function createSupportGroup( $name, $tag) { + + if(strlen($name) < 21 && strlen($name) > 4 &&strlen($tag) < 8 && strlen($tag) > 1 ){ + $notExists = self::supportGroup_EntryNotExists($name, $tag); + if ( $notExists == "SUCCESS" ){ + $sGroup = new self(); + $sGroup->setName($name); + $sGroup->setTag($tag); + $sGroup->create(); + return "SUCCESS"; + }else{ + //return NAME_TAKEN or TAG_TAKEN + return $notExists; + } + }else{ + //RETURN ERROR that indicates SIZE + return "SIZE_ERROR"; + } + } + + //check if group exists + public static function supportGroup_EntryNotExists( $name, $tag) { + $dbl = new DBLayer("lib"); + //check if name is already used + if( $dbl->execute("SELECT * FROM support_group WHERE Name = :name",array('name' => $name))->rowCount() ){ + return "NAME_TAKEN"; + } + else if( $dbl->execute("SELECT * FROM support_group WHERE Tag = :tag",array('tag' => $tag))->rowCount() ){ + return "TAG_TAKEN"; + }else{ + return "SUCCESS"; + } + } + + + //check if group exists + public static function supportGroup_Exists( $id) { + $dbl = new DBLayer("lib"); + //check if supportgroup id exist + if( $dbl->execute("SELECT * FROM support_group WHERE SGroupId = :id",array('id' => $id ))->rowCount() ){ + return true; + }else{ + return false; + } + } + + + //return constructed element based on SGroupId + public static function constr_SGroupId( $id) { + $instance = new self(); + $instance->setSGroup($id); + return $instance; + } + + //returns list of all users that are enlisted to a support group + public static function getAllUsersOfSupportGroup($group_id) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT * FROM `in_support_group` INNER JOIN `ticket_user` ON ticket_user.TUserId = in_support_group.User WHERE in_support_group.Group=:id", array('id' => $group_id)); + $rows = $statement->fetchAll(); + $result = Array(); + foreach($rows as $row){ + $userInstance = new Ticket_User(); + $userInstance->setTUserId($row['TUserId']); + $userInstance->setPermission($row['Permission']); + $userInstance->setExternId($row['ExternId']); + $result[] = $userInstance; + } + return $result; + } + + //wrapper for adding user to a support group + public static function deleteSupportGroup($group_id) { + + //check if group id exists + if (self::supportGroup_Exists($group_id)){ + $sGroup = new self(); + $sGroup->setSGroupId($group_id); + $sGroup->delete(); + }else{ + //return that group doesn't exist + return "GROUP_NOT_EXISTING"; + } + + } + + //wrapper for adding user to a support group + public static function deleteUserOfSupportGroup( $user_id, $group_id) { + + //check if group id exists + if (self::supportGroup_Exists($group_id)){ + + //check if user is in supportgroup + //if so, delete entry and return SUCCESS + if(In_Support_Group::userExistsInSGroup($user_id, $group_id) ){ + //delete entry + $inSGroup = new In_Support_Group(); + $inSGroup->setUser($user_id); + $inSGroup->setGroup($group_id); + $inSGroup->delete(); + return "SUCCESS"; + } + else{ + //else return USER_NOT_IN_GROUP + return "USER_NOT_IN_GROUP"; + } + + + }else{ + //return that group doesn't exist + return "GROUP_NOT_EXISTING"; + } + + } + + //wrapper for adding user to a support group + public static function addUserToSupportGroup( $user_id, $group_id) { + //check if group id exists + if (self::supportGroup_Exists($group_id)){ + //check if user isn't in supportgroup yet + //if not, create entry and return SUCCESS + if(! In_Support_Group::userExistsInSGroup($user_id, $group_id) ){ + //create entry + $inSGroup = new In_Support_Group(); + $inSGroup->setUser($user_id); + $inSGroup->setGroup($group_id); + $inSGroup->create(); + return "SUCCESS"; + } + else{ + //else return ALREADY_ADDED + return "ALREADY_ADDED"; + } + + + }else{ + //return that group doesn't exist + return "GROUP_NOT_EXISTING"; + } + + } + + //returns list of all category objects + public static function getAllSupportGroups() { + $dbl = new DBLayer("lib"); + $statement = $dbl->executeWithoutParams("SELECT * FROM `support_group`"); + $row = $statement->fetchAll(); + $result = Array(); + foreach($row as $group){ + $instance = new self(); + $instance->set($group); + $result[] = $instance; + } + return $result; + } + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// + + public function __construct() { + } + + //set values + public function set($values) { + $this->setSGroupId($values['SGroupId']); + $this->setName($values['Name']); + $this->setTag($values['Tag']); + } + + public function create() { + $dbl = new DBLayer("lib"); + $query = "INSERT INTO support_group (Name, Tag) VALUES (:name, :tag)"; + $values = Array('name' => $this->name, 'tag' => $this->tag); + $dbl->execute($query, $values); + } + + //Load with sGroupId + public function load_With_SGroupId( $id) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT * FROM `support_group` WHERE `SGroupId` = :id", array('id' => $id)); + $row = $statement->fetch(); + $this->set($row); + } + + + //update private data to DB. + public function update(){ + $dbl = new DBLayer("lib"); + $query = "UPDATE `support_group` SET `Name` = :name, `Tag` = :tag WHERE `SGroupId` = :id"; + $values = Array('id' => $this->getSGroupId(), 'name' => $this->getName(), 'tag' => $this->getTag() ); + $statement = $dbl->execute($query, $values); + } + + //delete entry + public function delete(){ + $dbl = new DBLayer("lib"); + $query = "DELETE FROM `support_group` WHERE `SGroupId` = :id"; + $values = Array('id' => $this->getSGroupId()); + $statement = $dbl->execute($query, $values); + } + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getSGroupId(){ + return $this->sGroupId; + } + + public function getName(){ + return $this->name; + } + + public function getTag(){ + return $this->tag; + } + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setSGroupId($id){ + $this->sGroupId = $id; + } + + public function setName($n){ + $this->name = $n; + } + + public function setTag($t){ + $this->tag = $t; + } + + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php index 1c68b822b..12376d9b4 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php @@ -14,39 +14,35 @@ class Sync{ */ static public function syncdata () { - global $cfg; - try { - $dbl = new DBLayer($cfg['db']['lib']); + $dbl = new DBLayer("lib"); $statement = $dbl->executeWithoutParams("SELECT * FROM ams_querycache"); - $rows = $statement->fetchAll(); - $dbs = new DBLayer($cfg['db']['shard']); + $rows = $statement->fetchAll(); foreach ($rows as $record) { - + + $db = new DBLayer($record['db']); switch($record['type']) { case 'createPermissions': case 'change_pass': $decode = json_decode($record['query']); $values = array('user' => $decode[0], 'pass' => $decode[1]); //make connection with and put into shard db & delete from the lib - $dbs->execute("SET Password = :pass WHERE Login = :user",$values); - $dbl->execute("DELETE FROM ams_querycache WHERE SID=:SID",array('SID' => $record['SID'])); + $db->execute("UPDATE user SET Password = :pass WHERE Login = :user",$values); break; case 'change_mail': $decode = json_decode($record['query']); $values = array('user' => $decode[0], 'mail' => $decode[1]); //make connection with and put into shard db & delete from the lib - $dbs->execute("SET Email = :mail WHERE Login = :user",$values); - $dbl->execute("DELETE FROM ams_querycache WHERE SID=:SID",array('SID' => $record['SID'])); + $db->execute("UPDATE user SET Email = :mail WHERE Login = :user",$values); break; case 'createUser': $decode = json_decode($record['query']); $values = array('login' => $decode[0], 'pass' => $decode[1], 'mail' => $decode[2] ); //make connection with and put into shard db & delete from the lib - $dbs->execute("INSERT INTO user (Login, Password, Email) VALUES (:login, :pass, :mail)",$values); - $dbl->execute("DELETE FROM ams_querycache WHERE SID=:SID",array('SID' => $record['SID'])); + $db->execute("INSERT INTO user (Login, Password, Email) VALUES (:login, :pass, :mail)",$values); break; } + $dbl->execute("DELETE FROM ams_querycache WHERE SID=:SID",array('SID' => $record['SID'])); } print('Syncing completed'); } diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket.php index f8f9f10e3..a9bceacd3 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket.php @@ -8,21 +8,65 @@ class Ticket{ private $queue; private $ticket_category; private $author; - private $db; + private $priority; ////////////////////////////////////////////Functions//////////////////////////////////////////////////// - /*FUNCTION: getTicketTitlesOf() + /*FUNCTION: ticketExists + * returns true if ticket exists + * + */ + public static function ticketExists($id) { + $dbl = new DBLayer("lib"); + //check if ticket is already assigned + if( $dbl->execute(" SELECT * FROM `ticket` WHERE `TId` = :ticket_id", array('ticket_id' => $id) )->rowCount() ){ + return true; + }else{ + return false; + } + } + + /*FUNCTION: getStatusArray + * returns all possible statusses + * + */ + public static function getStatusArray() { + return Array("Waiting on user reply","Waiting on support","Waiting on Dev reply","Closed"); + } + + /*FUNCTION: getPriorityArray + * returns all possible statusses + * + */ + public static function getPriorityArray() { + return Array("Low","Normal","High","Super Dupa High"); + } + + + /*FUNCTION: getEntireTicket + * return all ticket of the given author's id. + * + */ + public static function getEntireTicket($id,$view_as_admin) { + $ticket = new Ticket(); + $ticket->load_With_TId($id); + $reply_array = Ticket_Reply::getRepliesOfTicket($id, $view_as_admin); + return Array('ticket_obj' => $ticket,'reply_array' => $reply_array); + } + + + /*FUNCTION: getTicketTitlesOf * return all ticket of the given author's id. * */ - public static function getTicketsOf($author, $db_data) { - $dbl = new DBLayer($db_data); + public static function getTicketsOf($author) { + $dbl = new DBLayer("lib"); $statement = $dbl->execute("SELECT * FROM ticket INNER JOIN ticket_user ON ticket.Author = ticket_user.TUserId and ticket_user.ExternId=:id", array('id' => $author)); $row = $statement->fetchAll(); $result = Array(); foreach($row as $ticket){ - $instance = new self($db_data); + $instance = new self(); + $instance->setTId($ticket['TId']); $instance->setTimestamp($ticket['Timestamp']); $instance->setTitle($ticket['Title']); $instance->setStatus($ticket['Status']); @@ -39,52 +83,168 @@ class Ticket{ * creates a ticket + first initial reply and fills in the content of it! * */ - public static function create_Ticket( $title, $content, $category, $author, $db_data) { + public static function create_Ticket( $title, $content, $category, $author, $real_author) { - $ticket = new Ticket($db_data); - $ticket->set($title,0,0,$category,$author); + $ticket = new Ticket(); + $values = array("Title" => $title, "Status"=> 1, "Queue"=> 0, "Ticket_Category" => $category, "Author" => $author, "Priority" => 0); + $ticket->set($values); $ticket->create(); $ticket_id = $ticket->getTId(); - - $ticket_content = new Ticket_Content($db_data); - $ticket_content->setContent($content); - $ticket_content->create(); - $content_id = $ticket_content->getTContentId(); - + if ( $author == $real_author){ + Ticket_Log::createLogEntry( $ticket_id, $author, 1); + }else{ + Ticket_Log::createLogEntry( $ticket_id, $real_author, 2, $author); + } + Ticket_Reply::createReply($content, $author, $ticket_id, 0, $author); + Mail_Handler::send_ticketing_mail($ticket, $content, "NEW", $real_author); + return $ticket_id; - $ticket_reply = new Ticket_Reply($db_data); - $ticket_reply->set($ticket_id, $content_id, $author); - $ticket_reply->create(); + } + + /*FUNCTION: updateTicketStatus() + * + * + */ + public static function updateTicketStatus( $ticket_id, $newStatus, $author) { + + $ticket = new Ticket(); + $ticket->load_With_TId($ticket_id); + if ($ticket->getStatus() != $newStatus){ + $ticket->setStatus($newStatus); + Ticket_Log::createLogEntry( $ticket_id, $author, 5, $newStatus); + } + $ticket->update(); } + + /*FUNCTION: updateTicketStatusAndPriority() + * creates a ticket + first initial reply and fills in the content of it! + * + */ + public static function updateTicketStatusAndPriority( $ticket_id, $newStatus, $newPriority, $author) { + + $ticket = new Ticket(); + $ticket->load_With_TId($ticket_id); + if ($ticket->getStatus() != $newStatus){ + $ticket->setStatus($newStatus); + Ticket_Log::createLogEntry( $ticket_id, $author, 5, $newStatus); + } + if ($ticket->getPriority() != $newPriority){ + $ticket->setPriority($newPriority); + Ticket_Log::createLogEntry( $ticket_id, $author, 6, $newPriority); + } + $ticket->update(); + + } + + //return the latest reply. + public static function getLatestReply( $ticket_id) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT * FROM ticket_reply WHERE Ticket =:id ORDER BY TReplyId DESC LIMIT 1 ", array('id' => $ticket_id)); + $reply = new Ticket_Reply(); + $reply->set($statement->fetch()); + return $reply; + } + + public static function createReply($content, $author, $ticket_id, $hidden){ + //if not empty + if(! ( Trim ( $content ) === '' )){ + $content = filter_var($content, FILTER_SANITIZE_STRING); + $ticket = new Ticket(); + $ticket->load_With_TId($ticket_id); + //if status is not closed + if($ticket->getStatus() != 3){ + Ticket_Reply::createReply($content, $author, $ticket_id, $hidden, $ticket->getAuthor()); + + //notify ticket author that a new reply is added! + if($ticket->getAuthor() != $author){ + Mail_Handler::send_ticketing_mail($ticket, $content, "REPLY", $author); + } + + + }else{ + //TODO: Show error message that ticket is closed + } + }else{ + //TODO: Show error content is empty + } + } + + //returns SUCCESS_ASSIGNED, TICKET_NOT_EXISTING or ALREADY_ASSIGNED + public static function assignTicket($user_id, $ticket_id){ + if(self::ticketExists($ticket_id)){ + $returnvalue = Assigned::assignTicket($user_id, $ticket_id); + Ticket_Log::createLogEntry( $ticket_id, $user_id, 7); + return $returnvalue; + }else{ + return "TICKET_NOT_EXISTING"; + } + } + + //returns SUCCESS_UNASSIGNED, TICKET_NOT_EXISTING or NOT_ASSIGNED + public static function unAssignTicket($user_id, $ticket_id){ + if(self::ticketExists($ticket_id)){ + $returnvalue = Assigned::unAssignTicket($user_id, $ticket_id); + Ticket_Log::createLogEntry( $ticket_id, $user_id, 9); + return $returnvalue; + }else{ + return "TICKET_NOT_EXISTING"; + } + } + + public static function forwardTicket($user_id, $ticket_id, $group_id){ + if(self::ticketExists($ticket_id)){ + if(isset($group_id) && $group_id != ""){ + //unassign the ticket incase the ticket is assined to yourself + self::unAssignTicket($user_id, $ticket_id); + //forward the ticket + $returnvalue = Forwarded::forwardTicket($group_id, $ticket_id); + //make a log entry of this action + Ticket_Log::createLogEntry( $ticket_id, $user_id, 8, $group_id); + return $returnvalue; + }else{ + return "INVALID_SGROUP"; + } + }else{ + return "TICKET_NOT_EXISTING"; + } + } + + + + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// - public function __construct($db_data) { - $this->db = $db_data; + public function __construct() { + } //Set ticket object - public function set($t,$s,$q,$t_c,$a){ - $this->title = $t; - $this->status = $s; - $this->queue = $q; - $this->ticket_category = $t_c; - $this->author = $a; + public function set($values){ + if(isset($values['TId'])){ + $this->tId = $values['TId']; + } + $this->title = $values['Title']; + $this->status = $values['Status']; + $this->queue = $values['Queue']; + $this->ticket_category = $values['Ticket_Category']; + $this->author = $values['Author']; + $this->priority = $values['Priority']; } //create ticket by writing private data to DB. public function create(){ - $dbl = new DBLayer($this->db); - $query = "INSERT INTO ticket (Timestamp, Title, Status, Queue, Ticket_Category, Author) VALUES (now(), :title, :status, :queue, :tcat, :author)"; - $values = Array('title' => $this->title, 'status' => $this->status, 'queue' => $this->queue, 'tcat' => $this->ticket_category, 'author' => $this->author); + $dbl = new DBLayer("lib"); + $query = "INSERT INTO ticket (Timestamp, Title, Status, Queue, Ticket_Category, Author, Priority) VALUES (now(), :title, :status, :queue, :tcat, :author, :priority)"; + $values = Array('title' => $this->title, 'status' => $this->status, 'queue' => $this->queue, 'tcat' => $this->ticket_category, 'author' => $this->author, 'priority' => $this->priority); $this->tId = $dbl->executeReturnId($query, $values); ; } //return constructed element based on TId public function load_With_TId( $id) { - $dbl = new DBLayer($this->db); + $dbl = new DBLayer("lib"); $statement = $dbl->execute("SELECT * FROM ticket WHERE TId=:id", array('id' => $id)); $row = $statement->fetch(); $this->tId = $row['TId']; @@ -94,18 +254,24 @@ class Ticket{ $this->queue = $row['Queue']; $this->ticket_category = $row['Ticket_Category']; $this->author = $row['Author']; + $this->priority = $row['Priority']; } - //update private data to DB. public function update(){ - $dbl = new DBLayer($this->db); - $query = "UPDATE ticket SET Timestamp = :timestamp, Title = :title, Status = :status, Queue = :queue, Ticket_Category = :tcat, Author = :author WHERE TId=:id"; - $values = Array('id' => $this->tId, 'timestamp' => $this->timestamp, 'title' => $this->title, 'status' => $this->status, 'queue' => $this->queue, 'tcat' => $this->ticket_category, 'author' => $this->author); + $dbl = new DBLayer("lib"); + $query = "UPDATE ticket SET Timestamp = :timestamp, Title = :title, Status = :status, Queue = :queue, Ticket_Category = :tcat, Author = :author, Priority = :priority WHERE TId=:id"; + $values = Array('id' => $this->tId, 'timestamp' => $this->timestamp, 'title' => $this->title, 'status' => $this->status, 'queue' => $this->queue, 'tcat' => $this->ticket_category, 'author' => $this->author, 'priority' => $this->priority); $statement = $dbl->execute($query, $values); } - + /*FUNCTION: postreply + * returns all possible statusses + * + * + public function postReply() { + return Array("Waiting on user reply","Waiting on support","Waiting on Dev reply","Closed"); + }*/ ////////////////////////////////////////////Getters//////////////////////////////////////////////////// public function getTId(){ @@ -113,7 +279,7 @@ class Ticket{ } public function getTimestamp(){ - return $this->timestamp; + return Helpers::outputTime($this->timestamp); } public function getTitle(){ @@ -124,6 +290,16 @@ class Ticket{ return $this->status; } + public function getStatusText(){ + $statusArray = Ticket::getStatusArray(); + return $statusArray[$this->getStatus()]; + } + + public function getCategoryName(){ + $category = Ticket_Category::constr_TCategoryId($this->getTicket_Category()); + return $category->getName(); + } + public function getQueue(){ return $this->queue; } @@ -136,6 +312,41 @@ class Ticket{ return $this->author; } + public function getPriority(){ + return $this->priority; + } + + public function getPriorityText(){ + $priorityArray = Ticket::getPriorityArray(); + return $priorityArray[$this->getPriority()]; + } + + public function getAssigned(){ + $user_id = Assigned::getUserAssignedToTicket($this->getTId()); + if ($user_id == ""){ + return 0; + }else{ + return $user_id; + } + } + + public function getForwardedGroupName(){ + $group_id = Forwarded::getSGroupOfTicket($this->getTId()); + if ($group_id == ""){ + return 0; + }else{ + return Support_Group::getGroup($group_id)->getName(); + } + } + + public function getForwardedGroupId(){ + $group_id = Forwarded::getSGroupOfTicket($this->getTId()); + if ($group_id == ""){ + return 0; + }else{ + return $group_id; + } + } ////////////////////////////////////////////Setters//////////////////////////////////////////////////// public function setTId($id){ @@ -166,4 +377,8 @@ class Ticket{ $this->author = $a; } + public function setPriority($p){ + $this->priority = $p; + } + } \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_category.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_category.php index 1fe7227b7..c2fd6a5d4 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_category.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_category.php @@ -9,8 +9,8 @@ class Ticket_Category{ //Creates a ticket_Catergory in the DB - public static function createTicketCategory( $name ,$db ) { - $dbl = new DBLayer($db); + public static function createTicketCategory( $name) { + $dbl = new DBLayer("lib"); $query = "INSERT INTO ticket_category (Name) VALUES (:name)"; $values = Array('name' => $name); $dbl->execute($query, $values); @@ -19,20 +19,20 @@ class Ticket_Category{ //return constructed element based on TCategoryId - public static function constr_TCategoryId( $id, $db_data) { - $instance = new self($db_data); + public static function constr_TCategoryId( $id) { + $instance = new self(); $instance->setTCategoryId($id); return $instance; } //returns list of all category objects - public static function getAllCategories($db_data) { - $dbl = new DBLayer($db_data); + public static function getAllCategories() { + $dbl = new DBLayer("lib"); $statement = $dbl->executeWithoutParams("SELECT * FROM ticket_category"); $row = $statement->fetchAll(); $result = Array(); foreach($row as $category){ - $instance = new self($db_data); + $instance = new self(); $instance->tCategoryId = $category['TCategoryId']; $instance->name = $category['Name']; $result[] = $instance; @@ -43,13 +43,12 @@ class Ticket_Category{ ////////////////////////////////////////////Methods//////////////////////////////////////////////////// - public function __construct($db_data) { - $this->db = $db_data; + public function __construct() { } //return constructed element based on TCategoryId public function load_With_TCategoryId( $id) { - $dbl = new DBLayer($this->db); + $dbl = new DBLayer("lib"); $statement = $dbl->execute("SELECT * FROM ticket_category WHERE TCategoryId=:id", array('id' => $id)); $row = $statement->fetch(); $this->tCategoryId = $row['TCategoryId']; @@ -59,7 +58,7 @@ class Ticket_Category{ //update private data to DB. public function update(){ - $dbl = new DBLayer($this->db); + $dbl = new DBLayer("lib"); $query = "UPDATE ticket_category SET Name = :name WHERE TCategoryId=:id"; $values = Array('id' => $this->tCategoryId, 'name' => $this->name); $statement = $dbl->execute($query, $values); diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_content.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_content.php index 62130d1d9..bc9ca8398 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_content.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_content.php @@ -9,8 +9,8 @@ class Ticket_Content{ ////////////////////////////////////////////Functions//////////////////////////////////////////////////// //return constructed element based on TCategoryId - public static function constr_TContentId( $id, $db_data) { - $instance = new self($db_data); + public static function constr_TContentId( $id) { + $instance = new self(); $instance->setTContentId($id); return $instance; } @@ -18,13 +18,12 @@ class Ticket_Content{ ////////////////////////////////////////////Methods//////////////////////////////////////////////////// - public function __construct($db_data) { - $this->db = $db_data; + public function __construct() { } //Creates a ticket_content entry in the DB public function create() { - $dbl = new DBLayer($this->db); + $dbl = new DBLayer("lib"); $query = "INSERT INTO ticket_content (Content) VALUES (:content)"; $values = Array('content' => $this->content); $this->tContentId = $dbl->executeReturnId($query, $values); ; @@ -32,7 +31,7 @@ class Ticket_Content{ //return constructed element based on TContentId public function load_With_TContentId( $id) { - $dbl = new DBLayer($this->db); + $dbl = new DBLayer("lib"); $statement = $dbl->execute("SELECT * FROM ticket_content WHERE TContentId=:id", array('id' => $id)); $row = $statement->fetch(); $this->tContentId = $row['TContentId']; @@ -41,7 +40,7 @@ class Ticket_Content{ //update private data to DB. public function update(){ - $dbl = new DBLayer($this->db); + $dbl = new DBLayer("lib"); $query = "UPDATE ticket_content SET Content = :content WHERE TContentId=:id"; $values = Array('id' => $this->tContentId, 'content' => $this->content); $statement = $dbl->execute($query, $values); diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_log.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_log.php new file mode 100644 index 000000000..d011049d7 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_log.php @@ -0,0 +1,180 @@ +execute("SELECT * FROM ticket_log INNER JOIN ticket_user ON ticket_log.Author = ticket_user.TUserId and ticket_log.Ticket=:id ORDER BY ticket_log.TLogId ASC", array('id' => $ticket_id)); + $row = $statement->fetchAll(); + $result = Array(); + foreach($row as $log){ + $instanceAuthor = Ticket_User::constr_TUserId($log['Author']); + $instanceAuthor->setExternId($log['ExternId']); + $instanceAuthor->setPermission($log['Permission']); + + $instanceLog = new self(); + $instanceLog->setTLogId($log['TLogId']); + $instanceLog->setTimestamp($log['Timestamp']); + $instanceLog->setAuthor($instanceAuthor); + $instanceLog->setTicket($ticket_id); + $instanceLog->setQuery($log['Query']); + + $result[] = $instanceLog; + } + return $result; + } + + //Creates a log entry + public static function createLogEntry( $ticket_id, $author_id, $action, $arg = -1) { + global $TICKET_LOGGING; + if($TICKET_LOGGING){ + $dbl = new DBLayer("lib"); + $query = "INSERT INTO ticket_log (Timestamp, Query, Ticket, Author) VALUES (now(), :query, :ticket, :author )"; + $values = Array('ticket' => $ticket_id, 'author' => $author_id, 'query' => json_encode(array($action,$arg))); + $dbl->execute($query, $values); + } + } + + + //return constructed element based on TLogId + public static function constr_TLogId( $id) { + $instance = new self(); + $instance->setTLogId($id); + return $instance; + } + + //returns list of all logs of a ticket + public static function getAllLogs($ticket_id) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT * FROM ticket_log INNER JOIN ticket_user ON ticket_log.Author = ticket_user.TUserId and ticket_log.Ticket=:id", array('id' => $ticket_id)); + $row = $statement->fetchAll(); + $result = Array(); + foreach($row as $log){ + $instance = new self(); + $instance->set($log); + $result[] = $instance; + } + return $result; + } + + + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// + + public function __construct() { + } + + //set values + public function set($values) { + $this->setTLogId($values['TLogId']); + $this->setTimestamp($values['Timestamp']); + $this->setQuery($values['Query']); + $this->setTicket($values['Ticket']); + $this->setAuthor($values['Author']); + } + + //Load with tlogId + public function load_With_TLogId( $id) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT * FROM ticket_log WHERE TLogId=:id", array('id' => $id)); + $row = $statement->fetch(); + $this->set($row); + } + + + //update private data to DB. + public function update(){ + $dbl = new DBLayer("lib"); + $query = "UPDATE ticket_log SET Timestamp = :timestamp, Query = :query, Author = :author, Ticket = :ticket WHERE TLogId=:id"; + $values = Array('id' => $this->getTLogId(), 'timestamp' => $this->getTimestamp(), 'query' => $this->getQuery(), 'author' => $this->getAuthor(), 'ticket' => $this->getTicket() ); + $statement = $dbl->execute($query, $values); + } + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getTLogId(){ + return $this->tLogId; + } + + public function getTimestamp(){ + return Helpers::outputTime($this->timestamp); + } + + public function getQuery(){ + return $this->query; + } + + public function getAuthor(){ + return $this->author; + } + + public function getTicket(){ + return $this->ticket; + } + + public function getAction(){ + $decodedQuery = json_decode($this->query); + return $decodedQuery[0]; + } + + public function getArgument(){ + $decodedQuery = json_decode($this->query); + return $decodedQuery[1]; + } + + public function getActionTextArray(){ + $variables = Helpers::handle_language(); + $result = array(); + foreach ( $variables['ticket_log'] as $key => $value ){ + $result[$key] = $value; + } + return $result; + } + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setTLogId($id){ + $this->tLogId = $id; + } + + public function setTimestamp($t){ + $this->timestamp = $t; + } + + public function setQuery($q){ + $this->query = $q; + } + + public function setAuthor($a){ + $this->author = $a; + } + + public function setTicket($t){ + $this->ticket = $t; + } + + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_queue.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_queue.php new file mode 100644 index 000000000..8751efbaa --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_queue.php @@ -0,0 +1,89 @@ +query = "SELECT ticket . * FROM ticket LEFT JOIN assigned ON ticket.TId = assigned.Ticket WHERE assigned.Ticket IS NULL"; + $this->params = array(); + } + + public function loadAllTickets(){ + $this->query = "SELECT * FROM `ticket`"; + $this->params = array(); + } + + public function loadAllOpenTickets(){ + $this->query = "SELECT * FROM ticket INNER JOIN ticket_user ON ticket.Author = ticket_user.TUserId and ticket.Status!=3"; + $this->params = array(); + } + + public function loadAllClosedTickets(){ + $this->query = "SELECT * FROM ticket INNER JOIN ticket_user ON ticket.Author = ticket_user.TUserId and ticket.Status=3"; + $this->params = array(); + } + + public function loadToDoTickets($user_id){ + + //first: find the tickets assigned to the user with status = waiting on support + //second find all not assigned tickets that aren't forwarded yet. + //find all tickets assigned to someone else witht status waiting on support, with timestamp of last reply > 1 day + //find all non-assigned tickets forwarded to the support groups to which that user belongs + $this->query = "SELECT * FROM `ticket` t LEFT JOIN `assigned` a ON t.TId = a.Ticket LEFT JOIN `ticket_user` tu ON tu.TUserId = a.User LEFT JOIN `forwarded` f ON t.TId = f.Ticket + WHERE (tu.ExternId = :user_id AND t.Status = 1) + OR (a.Ticket IS NULL AND f.Group IS NULL) + OR (tu.ExternId != :user_id AND t.Status = 1 AND (SELECT ticket_reply.Timestamp FROM `ticket_reply` WHERE Ticket =t.TId ORDER BY TReplyId DESC LIMIT 1) < NOW() - INTERVAL 1 DAY ) + OR (a.Ticket IS NULL AND EXISTS (SELECT * FROM `in_support_group` isg JOIN `ticket_user` tu2 ON isg.User = tu2.TUserId WHERE isg.Group = f.Group)) + "; + $this->params = array('user_id' => $user_id); + } + + public function createQueue($userid, $groupid, $what, $how, $who){ + + if($who == "user"){ + $selectfrom = "SELECT * FROM `ticket` t LEFT JOIN `assigned` a ON t.TId = a.Ticket LEFT JOIN `ticket_user` tu ON tu.TUserId = a.User"; + if ($how == "assigned"){ + $assign = "tu.TUserId = :id" ; + }else if ($how == "not_assigned"){ + $assign = "(tu.TUserId != :id OR a.Ticket IS NULL)"; + } + }else if ($who == "support_group"){ + $selectfrom = "SELECT * FROM `ticket` t LEFT JOIN `assigned` a ON t.TId = a.Ticket LEFT JOIN `ticket_user` tu ON tu.TUserId = a.User LEFT JOIN `forwarded` f ON t.TId = f.Ticket"; + if ($how == "assigned"){ + $assign = "f.Group = :id"; + }else if ($how == "not_assigned"){ + $assign = "(f.Group != :id OR f.Ticket IS NULL)" ; + } + + } + + if ($what == "waiting_for_support"){ + $status = "t.Status = 1"; + }else if ($what == "waiting_for_user"){ + $status = "t.Status = 0"; + }else if ($what == "closed"){ + $status = "t.Status = 3"; + } + + $query = $selectfrom ." WHERE " . $assign; + if(isset($status)){ + $query = $query . " AND " . $status; + } + if($who == "user"){ + $params = array('id' => $userid); + }else if ($who == "support_group"){ + $params = array('id' => $groupid); + } + $this->query = $query; + $this->params = $params; + } + + public function getQuery(){ + return $this->query; + } + + public function getParams(){ + return $this->params; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_queue_handler.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_queue_handler.php new file mode 100644 index 000000000..8930a0651 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_queue_handler.php @@ -0,0 +1,58 @@ +queue = new Ticket_Queue(); + } + + public function getTickets($input, $user_id){ + + switch ($input){ + case "all": + $this->queue->loadAllTickets(); + break; + case "all_open": + $this->queue->loadAllOpenTickets(); + break; + case "archive": + $this->queue->loadAllClosedTickets(); + break; + case "not_assigned": + $this->queue->loadAllNotAssignedTickets(); + break; + case "todo": + $this->queue->loadToDoTickets($user_id); + break; + case "create": + //set these with the createQueue function proceding the getTickets function + break; + default: + return "ERROR"; + } + $this->pagination = new Pagination($this->queue->getQuery(),"lib",10,"Ticket",$this->queue->getParams()); + foreach( $this->pagination->getElements() as $element ){ + $catInstance = new Ticket_Category(); + $catInstance->load_With_TCategoryId($element->getTicket_Category()); + $element->setTicket_Category($catInstance); + + $userInstance = new Ticket_User(); + $userInstance->load_With_TUserId($element->getAuthor()); + $element->setAuthor($userInstance); + } + return $this->pagination->getElements(); + + } + + public function getPagination(){ + return $this->pagination; + } + + public function createQueue($userid, $groupid, $what, $how, $who){ + $this->queue->createQueue($userid, $groupid, $what, $how, $who); + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_reply.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_reply.php index 8f14a9f5f..dafbdf74b 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_reply.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_reply.php @@ -6,56 +6,110 @@ class Ticket_Reply{ private $content; private $author; private $timestamp; - private $db; + private $hidden; ////////////////////////////////////////////Functions//////////////////////////////////////////////////// //return constructed element based on TCategoryId - public static function constr_TReplyId( $id, $db_data) { - $instance = new self($db_data); + public static function constr_TReplyId( $id) { + $instance = new self(); $instance->setTReplyId($id); return $instance; } + + //return constructed element based on TCategoryId + public static function getRepliesOfTicket( $ticket_id, $view_as_admin) { + $dbl = new DBLayer("lib"); + $statement = $dbl->execute("SELECT * FROM ticket_reply INNER JOIN ticket_content INNER JOIN ticket_user ON ticket_reply.Content = ticket_content.TContentId and ticket_reply.Ticket=:id and ticket_user.TUserId = ticket_reply.Author ORDER BY ticket_reply.TReplyId ASC", array('id' => $ticket_id)); + $row = $statement->fetchAll(); + $result = Array(); + foreach($row as $tReply){ + if(! $tReply['Hidden'] || $view_as_admin){ + $instanceAuthor = Ticket_User::constr_TUserId($tReply['Author']); + $instanceAuthor->setExternId($tReply['ExternId']); + $instanceAuthor->setPermission($tReply['Permission']); + + $instanceContent = new Ticket_Content(); + $instanceContent->setTContentId($tReply['TContentId']); + $instanceContent->setContent($tReply['Content']); + + $instanceReply = new self(); + $instanceReply->setTReplyId($tReply['TReplyId']); + $instanceReply->setTimestamp($tReply['Timestamp']); + $instanceReply->setAuthor($instanceAuthor); + $instanceReply->setTicket($ticket_id); + $instanceReply->setContent($instanceContent); + $instanceReply->setHidden($tReply['Hidden']); + $result[] = $instanceReply; + } + } + return $result; + } + + public static function createReply($content, $author, $ticket_id , $hidden, $ticket_creator){ + $ticket_content = new Ticket_Content(); + $ticket_content->setContent($content); + $ticket_content->create(); + $content_id = $ticket_content->getTContentId(); + + $ticket_reply = new Ticket_Reply(); + $ticket_reply->set(Array('Ticket' => $ticket_id,'Content' => $content_id,'Author' => $author, 'Hidden' => $hidden)); + $ticket_reply->create(); + $reply_id = $ticket_reply->getTReplyId(); + + if($ticket_creator == $author){ + Ticket::updateTicketStatus( $ticket_id, 1, $author); + } + + Ticket_Log::createLogEntry( $ticket_id, $author, 4, $reply_id); + } + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// - public function __construct($db_data) { - $this->db = $db_data; + public function __construct() { } //Set ticket_reply object - public function set($t,$c,$a){ - $this->ticket = $t; - $this->content = $c; - $this->author = $a; + public function set($values){ + $this->setTicket($values['Ticket']); + $this->setContent($values['Content']); + $this->setAuthor($values['Author']); + if(isset($values['Timestamp'])){ + $this->setTimestamp($values['Timestamp']); + } + if(isset($values['Hidden'])){ + $this->setHidden($values['Hidden']); + } } //create ticket by writing private data to DB. public function create(){ - $dbl = new DBLayer($this->db); - $query = "INSERT INTO ticket_reply (Ticket, Content, Author, Timestamp) VALUES (:ticket, :content, :author, now())"; - $values = Array('ticket' => $this->ticket, 'content' => $this->content, 'author' => $this->author); - $dbl->execute($query, $values); + $dbl = new DBLayer("lib"); + $query = "INSERT INTO ticket_reply (Ticket, Content, Author, Timestamp, Hidden) VALUES (:ticket, :content, :author, now(), :hidden)"; + $values = Array('ticket' => $this->ticket, 'content' => $this->content, 'author' => $this->author, 'hidden' => $this->hidden); + $this->tReplyId = $dbl->executeReturnId($query, $values); } //return constructed element based on TId public function load_With_TReplyId( $id) { - $dbl = new DBLayer($this->db); + $dbl = new DBLayer("lib"); $statement = $dbl->execute("SELECT * FROM ticket_reply WHERE TReplyId=:id", array('id' => $id)); $row = $statement->fetch(); $this->tReplyId = $row['TReplyId']; $this->ticket = $row['Ticket']; $this->content = $row['Content']; $this->author = $row['Author']; - $this->timestamp = $row['Timestamp']; + $this->timestamp = $row['Timestamp']; + $this->hidden = $row['Hidden']; } //update private data to DB. public function update(){ - $dbl = new DBLayer($this->db); - $query = "UPDATE ticket SET Ticket = :ticket, Content = :content, Author = :author, Timestamp = :timestamp WHERE TReplyId=:id"; - $values = Array('id' => $this->tReplyId, 'timestamp' => $this->timestamp, 'ticket' => $this->ticket, 'content' => $this->content, 'author' => $this->author); + $dbl = new DBLayer("lib"); + $query = "UPDATE ticket SET Ticket = :ticket, Content = :content, Author = :author, Timestamp = :timestamp, Hidden = :hidden WHERE TReplyId=:id"; + $values = Array('id' => $this->tReplyId, 'timestamp' => $this->timestamp, 'ticket' => $this->ticket, 'content' => $this->content, 'author' => $this->author, 'hidden' => $this->hidden); $statement = $dbl->execute($query, $values); } @@ -75,14 +129,17 @@ class Ticket_Reply{ } public function getTimestamp(){ - return $this->timestamp; + return Helpers::outputTime($this->timestamp); } public function getTReplyId(){ return $this->tReplyId; } - + + public function getHidden(){ + return $this->hidden; + } ////////////////////////////////////////////Setters//////////////////////////////////////////////////// @@ -107,4 +164,8 @@ class Ticket_Reply{ public function setTReplyId($i){ $this->tReplyId = $i; } + + public function setHidden($h){ + $this->hidden = $h; + } } \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_user.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_user.php index b61c99f68..fe3529925 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_user.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_user.php @@ -4,32 +4,58 @@ class Ticket_User{ private $tUserId; private $permission; private $externId; - private $db; ////////////////////////////////////////////Functions//////////////////////////////////////////////////// //Creates a ticket_user in the DB - public static function createTicketUser( $extern_id, $permission,$db ) { - $dbl = new DBLayer($db); + public static function createTicketUser( $extern_id, $permission) { + $dbl = new DBLayer("lib"); $query = "INSERT INTO ticket_user (Permission, ExternId) VALUES (:perm, :ext_id)"; $values = Array('perm' => $permission, 'ext_id' => $extern_id); $dbl->execute($query, $values); } - - + + public static function isMod($user){ + if(isset($user) && $user->getPermission() > 1){ + return true; + } + return false; + } + + public static function isAdmin($user){ + if(isset($user) && $user->getPermission() == 3){ + return true; + } + return false; + } + //return constructed element based on TUserId - public static function constr_TUserId( $id, $db_data) { - $instance = new self($db_data); + public static function constr_TUserId( $id) { + $instance = new self(); $instance->setTUserId($id); return $instance; } + //return all mods/admins + public static function getModsAndAdmins() { + $dbl = new DBLayer("lib"); + $statement = $dbl->executeWithoutParams("SELECT * FROM `ticket_user` WHERE `Permission` > 1"); + $rows = $statement->fetchAll(); + $result = Array(); + foreach($rows as $user){ + $instanceUser = new self(); + $instanceUser->set($user); + $result[] = $instanceUser; + } + return $result; + } + //return constructed element based on ExternId - public static function constr_ExternId( $id, $db_data ) { - $instance = new self($db_data); - $dbl = new DBLayer($instance->db); + public static function constr_ExternId( $id) { + $instance = new self(); + $dbl = new DBLayer("lib"); $statement = $dbl->execute("SELECT * FROM ticket_user WHERE ExternId=:id", array('id' => $id)); $row = $statement->fetch(); $instance->tUserId = $row['TUserId']; @@ -39,26 +65,69 @@ class Ticket_User{ } + public static function change_permission($user_id, $perm){ + $user = new Ticket_User(); + $user->load_With_TUserId($user_id); + $user->setPermission($perm); + $user->update(); + } + + + public static function get_email_by_user_id($id){ + $user = new Ticket_User(); + $user->load_With_TUserId($id); + $webUser = new WebUsers($user->getExternId()); + return $webUser->getEmail(); + } + + + public static function get_username_from_id($id){ + $user = new Ticket_User(); + $user->load_With_TUserId($id); + $webUser = new WebUsers($user->getExternId()); + return $webUser->getUsername(); + } + + + public static function get_id_from_username($username){ + $externId = WebUsers::getId($username); + $user = Ticket_User::constr_ExternId($externId); + return $user->getTUserId(); + } + + + public static function get_id_from_email($email){ + $webUserId = WebUsers::getIdFromEmail($email); + $user = Ticket_User::constr_ExternId($webUserId); + return $user->getTUserId(); + } + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// - public function __construct($db_data) { - $this->db = $db_data; + public function __construct() { } + //set values + public function set($values) { + $this->setTUserId($values['TUserId']); + $this->setPermission($values['Permission']); + $this->setExternId($values['ExternId']); + } + + //return constructed element based on TUserId public function load_With_TUserId( $id) { - $dbl = new DBLayer($this->db); + $dbl = new DBLayer("lib"); $statement = $dbl->execute("SELECT * FROM ticket_user WHERE TUserId=:id", array('id' => $id)); $row = $statement->fetch(); - $instance->tUserId = $row['TUserId']; - $instance->permission = $row['Permission']; - $instance->externId = $row['ExternId']; - return $instance; + $this->tUserId = $row['TUserId']; + $this->permission = $row['Permission']; + $this->externId = $row['ExternId']; } //update private data to DB. public function update(){ - $dbl = new DBLayer($this->db); + $dbl = new DBLayer("lib"); $query = "UPDATE ticket_user SET Permission = :perm, ExternId = :ext_id WHERE TUserId=:id"; $values = Array('id' => $this->tUserId, 'perm' => $this->permission, 'ext_id' => $this->externId); $statement = $dbl->execute($query, $values); @@ -67,17 +136,11 @@ class Ticket_User{ ////////////////////////////////////////////Getters//////////////////////////////////////////////////// public function getPermission(){ - if ($this->permission == ""){ - $this->load_With_TUserId($this->tUserId); - } return $this->permission; } public function getExternId(){ - if ($this->ExternId == ""){ - $this->load_With_TUserId($this->tUserId); - } return $this->externId; } @@ -98,4 +161,9 @@ class Ticket_User{ $this->externId = $id; } + public function setTUserId($id){ + $this->tUserId= $id; + } + + } \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/users.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/users.php index 9ce16aa37..d5ba0963a 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/users.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/users.php @@ -243,7 +243,7 @@ class Users{ * @takes $length, which is by default 2 * @return a random salt of 2 chars */ - public function generateSALT( $length = 2 ) + public static function generateSALT( $length = 2 ) { // start with a blank salt $salt = ""; @@ -284,22 +284,21 @@ class Users{ * @takes $array with name,pass and mail * @return ok if it's get correctly added to the shard, else return lib offline and put in libDB, if libDB is also offline return liboffline. */ - public function createUser($values, $user_id){ + public static function createUser($values, $user_id){ try { //make connection with and put into shard db - global $cfg; - $dbs = new DBLayer($cfg['db']['shard']); + $dbs = new DBLayer("shard"); $dbs->execute("INSERT INTO user (Login, Password, Email) VALUES (:name, :pass, :mail)",$values); - ticket_user::createTicketUser( $user_id , 1, $cfg['db']['lib'] ); + ticket_user::createTicketUser( $user_id, 1); return "ok"; } catch (PDOException $e) { //oh noooz, the shard is offline! Put in query queue at ams_lib db! try { - $dbl = new DBLayer($cfg['db']['lib']); - $dbl->execute("INSERT INTO ams_querycache (type, query) VALUES (:type, :query)",array("type" => "createUser", - "query" => json_encode(array($values["name"],$values["pass"],$values["mail"])))); - ticket_user::createTicketUser( $user_id , 1, $cfg['db']['lib'] ); + $dbl = new DBLayer("lib"); + $dbl->execute("INSERT INTO ams_querycache (type, query, db) VALUES (:type, :query, :db)",array("type" => "createUser", + "query" => json_encode(array($values["name"],$values["pass"],$values["mail"])), "db" => "shard")); + ticket_user::createTicketUser( $user_id , 1 ); return "shardoffline"; }catch (PDOException $e) { print_r($e); @@ -369,21 +368,20 @@ class Users{ protected function setAmsPassword($user, $pass){ - global $cfg; $values = Array('user' => $user, 'pass' => $pass); try { //make connection with and put into shard db - $dbs = new DBLayer($cfg['db']['shard']); + $dbs = new DBLayer("shard"); $dbs->execute("UPDATE user SET Password = :pass WHERE Login = :user ",$values); return "ok"; } catch (PDOException $e) { //oh noooz, the shard is offline! Put in query queue at ams_lib db! try { - $dbl = new DBLayer($cfg['db']['lib']); - $dbl->execute("INSERT INTO ams_querycache (type, query) VALUES (:type, :query)",array("type" => "change_pass", - "query" => json_encode(array($values["user"],$values["pass"])))); + $dbl = new DBLayer("lib"); + $dbl->execute("INSERT INTO ams_querycache (type, query, db) VALUES (:type, :query, :db)",array("type" => "change_pass", + "query" => json_encode(array($values["user"],$values["pass"])), "db" => "shard")); return "shardoffline"; }catch (PDOException $e) { return "liboffline"; @@ -393,21 +391,20 @@ class Users{ protected function setAmsEmail($user, $mail){ - global $cfg; $values = Array('user' => $user, 'mail' => $mail); try { //make connection with and put into shard db - $dbs = new DBLayer($cfg['db']['shard']); + $dbs = new DBLayer("shard"); $dbs->execute("UPDATE user SET Email = :mail WHERE Login = :user ",$values); return "ok"; } catch (PDOException $e) { //oh noooz, the shard is offline! Put in query queue at ams_lib db! try { - $dbl = new DBLayer($cfg['db']['lib']); - $dbl->execute("INSERT INTO ams_querycache (type, query) VALUES (:type, :query)",array("type" => "change_mail", - "query" => json_encode(array($values["user"],$values["mail"])))); + $dbl = new DBLayer("lib"); + $dbl->execute("INSERT INTO ams_querycache (type, query, db) VALUES (:type, :query, :db)",array("type" => "change_mail", + "query" => json_encode(array($values["user"],$values["mail"])), "db" => "shard")); return "shardoffline"; }catch (PDOException $e) { return "liboffline"; diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/configs/ingame_layout.ini b/code/ryzom/tools/server/ryzom_ams/ams_lib/configs/ingame_layout.ini new file mode 100644 index 000000000..e76cf2acf --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/configs/ingame_layout.ini @@ -0,0 +1,44 @@ +; This is the ingame layout config file +; Here you can easily change colors of specific elements in the ingame templates. + +;------------------------------------------------------------------------------- + +[basic] + +;second menu bar bg color +second_menu_bg_color = "#00000040" + +;title bg color +title_bg_color = "#303030" + +;default info text color +info_color = "#00CED1" + +;Account (user/admin/mod) name color +team_color = "red" +user_color = "green" +mod_color = "orange" +admin_color = "red" + +;main table bg color +main_tbl_color = "#00000030" + +;normal table bg color +normal_tbl_color = "#00000060" + +;table bg color for team replies +team_reply_tbl_color = "#F8C8C140" + +;table bg color for hidden replies +hidden_reply_tbl_color = "#CFFEFF40" + +;table bg color for closed reply +closed_tbl_color = "#FFE69960" + +;table header tr bg color +table_header_tr_color = "#00000090" + +;pagination current page bg +pagination_current_page_bg = "#00CED190" + +;------------------------------------------------------------------------------- \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/cron/mail_cron.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/cron/mail_cron.php new file mode 100644 index 000000000..9d669e866 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/cron/mail_cron.php @@ -0,0 +1,7 @@ +cron(); \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/createticket.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/createticket.tpl new file mode 100644 index 000000000..dd19fd291 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/createticket.tpl @@ -0,0 +1,80 @@ +{block name=content} + + + + +{/block} + + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/home.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/home.tpl new file mode 100644 index 000000000..81ba9d934 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/home.tpl @@ -0,0 +1,55 @@ +{block name=content} + + + + + + + + + + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout.tpl new file mode 100644 index 000000000..c98768e52 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout.tpl @@ -0,0 +1,34 @@ + + + + + Ryzom Account Management System + + + + + + +
+ + + + + + + + + +

Create a new ticket

+
+ + + + + + + + + + +
+ + +
+
+ + +
+ + +
+ + +
+
+ + + + + + + + + + + + + + + + +
Title: + +
Category: + +
Description:
+ + + +
+
+
+
+
+
+ +
+ + + + + + + + + +

{$home_title}

+
+ + + + + + + + + + +
+ + +
+
+ + +
+ + +
+ + +
+

{$home_info}

+
+
+
+
+ +
+ + {block name=content}{/block} + + + +
+ + + + + {block name=menu}{/block} + + + +
+
+ + + + + + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_admin.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_admin.tpl new file mode 100644 index 000000000..b3ce83d86 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_admin.tpl @@ -0,0 +1,19 @@ +{extends file="layout.tpl"} +{block name=menu} +

Dashboard
+ +
Profile
+ +
Settings
+ + | + +
Users
+ +
Queues
+ +
Support Groups
+ + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_mod.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_mod.tpl new file mode 100644 index 000000000..34911226f --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_mod.tpl @@ -0,0 +1,18 @@ +{extends file="layout.tpl"} +{block name=menu} +
Dashboard
+ +
Profile
+ +
Settings
+ + | + +
Users
+ +
Queues
+ +
Support Groups
+ +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_user.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_user.tpl new file mode 100644 index 000000000..b876fa1c5 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/layout_user.tpl @@ -0,0 +1,24 @@ +{extends file="layout.tpl"} +{block name=menu} + +
  • Dashboard
  • +
  • Profile
  • +
  • Settings
  • + +
  • Create New Ticket
  • +
  • Logout
  • + + +
    Dashboard
    + +
    Profile
    + +
    Settings
    + + | + +
    Create New Ticket
    + + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/login.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/login.tpl new file mode 100644 index 000000000..ad6f48e0d --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/login.tpl @@ -0,0 +1,40 @@ +

     

    + +
    +
    +

    {$login_info}

    +
    +
    +
    +

    + Username: + +

    + + +

    + Password: + +

    + +

    + Remember me: +

    Remember me +

    + +

    + + +

    + +
    + + {if isset($login_error) and $login_error eq "TRUE"} +

    + {$login_error_message} +

    + {/if} +

    + {$login_register_message} {$login_register_message_here}! +

    +
    diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/register.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/register.tpl index 17100d13d..03cb7c9d3 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/register.tpl +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/register.tpl @@ -6,7 +6,7 @@
    {$welcome_message}
    - +click hereeeee
    @@ -112,4 +112,4 @@ {$email_message} -
    \ No newline at end of file +
    diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/settings.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/settings.tpl new file mode 100644 index 000000000..c8f67140c --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/settings.tpl @@ -0,0 +1,217 @@ +{block name=content} + + + + + + + + +
    + + + + +
    + + + + + {if isset($isAdmin) and $isAdmin eq 'TRUE' and $target_id neq 1} + {if $userPermission eq 1} + + + {else if $userPermission eq 2 } + + + {else if $userPermission eq 3 } + + + {/if} + {/if} + +
    Browse UserSend TicketMake ModeratorMake AdminDemote to UserMake AdminDemote to UserDemote to Moderator
    +
    +
    + + + + + + + + + + + + +

    Change Settings

    + + + + + + + + + + + + +
    + + +
    +
    + + + + +
    + + +
    + + +
    + +

    Change Password

    + + + + {if !isset($changesOther) or $changesOther eq "FALSE"} + + + +

    + + {/if} + + + +
    + Current Password: + + + {if isset($MATCH_ERROR) and $MATCH_ERROR eq "TRUE"}The password is incorrect{/if} +
    + New Password: + + + {if isset($NEWPASSWORD_ERROR) and $NEWPASSWORD_ERROR eq "TRUE"}{$newpass_error_message}{/if} +
    + Confirm New Password: + + + {if isset($CNEWPASSWORD_ERROR) and $CNEWPASSWORD_ERROR eq "TRUE"}{$confirmnewpass_error_message}{/if} +
    + {if isset($SUCCESS_PASS) and $SUCCESS_PASS eq "OK"} +

    + The password has been changed! +

    + {/if} + + + + + +

    + + + +
    +
    +
    + + +
    + + +
    +

    Change Email

    + +
    + + +
    + New Email: + + + {if isset($EMAIL_ERROR) and $EMAIL_ERROR eq "TRUE"}{$EMAIL}{/if} +
    + {if isset($SUCCESS_MAIL) and $SUCCESS_MAIL eq "OK"} +

    + The email has been changed! +

    + {/if} + + + +

    + +

    + +
    +
    +
    + + +
    + + +
    +

    Change Info

    +
    + + + + + + + + + + + + + + + + + + + + +
    Firstname:
    Lastname:
    Country:
    Gender +
    + {if isset($info_updated) and $info_updated eq "OK"} +

    + The Info has been updated! +

    + {/if} + + + + +

    + +

    +
    + +
    +
    +
    +
    + + + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/sgroup_list.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/sgroup_list.tpl new file mode 100644 index 000000000..6279d8fe4 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/sgroup_list.tpl @@ -0,0 +1,114 @@ +{block name=content} + + + + + + + + + + + +

    Support Groups

    + + + + + + + + + + + + +
    + + +
    +
    + + {if isset($isAdmin) && $isAdmin eq 'TRUE'} + + {/if} + +
    + + +
    + + +
    +

    Add a Support group

    + +
    + + + + + + + + + + +
    Group name:
    Group Tag:
    + +

    + + + {if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "SUCCESS"} +

    + {$group_success} +

    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "NAME_TAKEN"} +

    + {$group_name_taken} +

    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "TAG_TAKEN"} +

    + {$group_tag_taken} +

    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "SIZE_ERROR"} +

    + {$group_size_error} +

    + {/if} +
    +
    +
    +
    + + +
    + + +
    +

    All groups

    + + + + + + {if isset($isAdmin) && $isAdmin eq 'TRUE'}{/if} + + + {foreach from=$grouplist item=group} + + + + + {if isset($isAdmin) && $isAdmin eq 'TRUE'}{/if} + + {/foreach} +
    IDNameTagAction
    {$group.sGroupId}{$group.name}{$group.tag}Delete
    +
    +
    +
    +
    + + + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_queue.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_queue.tpl new file mode 100644 index 000000000..eeda5813e --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_queue.tpl @@ -0,0 +1,222 @@ +{block name=content} + + + + + + + + +
    + + + + +
    + + + + + + + + +
    Todo ticketsAll ticketsAll open ticketsTicket ArchiveNot Assigned Tickets
    +
    +
    + + + + + + + + + + + + +

    Ticket Queue: {$queue_view}

    + + + + + + + + + + + + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_reply.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_reply.tpl new file mode 100644 index 000000000..b6aa90cb2 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_reply.tpl @@ -0,0 +1,88 @@ +{block name=content} + + + + +{/block} + + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_sgroup.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_sgroup.tpl new file mode 100644 index 000000000..388cf8e32 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_sgroup.tpl @@ -0,0 +1,113 @@ +{block name=content} + + + + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_ticket.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_ticket.tpl new file mode 100644 index 000000000..5058a5776 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_ticket.tpl @@ -0,0 +1,284 @@ +{block name=content} + + + + + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_ticket_log.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_ticket_log.tpl new file mode 100644 index 000000000..57dff23b6 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_ticket_log.tpl @@ -0,0 +1,88 @@ +{block name=content} + + + + +{/block} + \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_user.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_user.tpl new file mode 100644 index 000000000..93110b895 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/show_user.tpl @@ -0,0 +1,163 @@ +{block name=content} + + + + + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/userlist.tpl b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/userlist.tpl new file mode 100644 index 000000000..4e5f2a4ae --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/ingame_templates/userlist.tpl @@ -0,0 +1,96 @@ +{block name=content} + + + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/libinclude.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/libinclude.php index 0d8606488..e5deb6030 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/libinclude.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/libinclude.php @@ -3,6 +3,10 @@ // Base include file for library functions for AMS // *********************************************** function __autoload( $className ){ - require_once 'autoload/' . strtolower ( $className ) . '.php'; + if(file_exists( '/home/daan/ryzom/ryzomcore/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/' . strtolower ( $className ) . '.php')){ + require_once 'autoload/' . strtolower ( $className ) . '.php'; + } + if($className == "WebUsers") + require_once '/home/daan/ryzom/ryzomcore/code/ryzom/tools/server/ryzom_ams/www/html/autoload/' . strtolower ( $className ) . '.php'; } diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini index 858c3020f..90619bcfc 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini @@ -7,10 +7,10 @@ home_info = "Welcome to the Ryzom Core - Account Management System" [settings] -[libuserlist] -libuserlist_title = "LibDB-Query List" -libuserlist_info = "Here you can see the entire list of elements in the LibDB-Query table. You can easily remove elements and by pressing 'Synchronize' you can start the syncing process manually!" -libuserlist_sync = "Synchronize" +[syncing] +syncing_title = "LibDB-Query List" +syncing_info = "Here you can see the entire list of elements in the LibDB-Query table. You can easily remove elements and by pressing 'Synchronize' you can start the syncing process manually!" +syncing_sync = "Synchronize" shard_online = "The shard seems to be online, manually syncing is possible: " shard_offline = "The shard seems to be offline, manually syncing is not possible!" members = "Members" @@ -20,10 +20,63 @@ name = "Name" email = "Email" action = "Action" +[show_ticket] +t_title = "Ticket" +title = "Title" +t_reply = "Reply on ticket" +t_fill = "Fill in your reply" +t_send = "Send reply" +invalid_sgroup = "Invalid support group!" +ticket_not_existing = "That's an invalid ticket" +success_forwarded = "The ticket was forwarded successfully!" +public_sgroup = "Public" +not_assigned = "None" +success_assigned = "The ticket was successfully assigned!" +success_unassigned = "The ticket was successfully unassigned!" +ticket_not_existing = "That ticket doesn't exist!" +ticket_already_assigned = "That ticket is already assigned to someone!" + [show_user] +[show_queue] +not_assigned = "Open" +success_assigned = "The ticket was successfully assigned!" +success_unassigned = "The ticket was successfully unassigned!" +ticket_not_existing = "That ticket doesn't exist!" +ticket_already_assigned = "That ticket is already assigned to someone!" +ticket_not_assigned = "That ticket isn't assigned to you!" +public_sgroup = "Public" + +[show_sgroup] +add_to_group_success = "The user has been added to the group!" +user_already_added = "The user is already part of the group!" +group_not_existing = "The group doesn't exist!" +user_not_existing = "The user doesn't seem to exist" +not_mod_or_admin = "You can only add Moderators or Admins!" + +[sgroup_list] +group_success = "The group has been created!" +group_name_taken = "The groupname was already used!" +group_tag_taken = "The tag was already used!" +group_size_error = "The name has to be between 4-20 chars and the tag between 2-4!" + [createticket] +[show_ticket_log] + +[show_reply] + +[ticket_log] +1 = "created the ticket" +2 = "created the ticket for" +3 = "read the ticket" +4 = "added reply" +5 = "changed the status to" +6 = "changed the priority to" +7 = "assigned to the ticket" +8 = "forwarded the ticket to the support group: " +9 = "unassigned from the ticket" + [error] title404 = "Not
    Found!" title403 = "Forbidden!" diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini index 150a62c6b..9127fd0a3 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini @@ -7,10 +7,10 @@ home_info = "Bienvenue sur le Ryzom Core - Account Management System" [settings] -[libuserlist] -libuserlist_title = "LibDB-Query Liste" -libuserlist_info = "Ici vous pouvez voir la liste complete des elements dans le tableau libdb-Query. Vous pouvez facilement supprimer des elements et appuyant sur 'Synchroniser', vous pouvez commencer le processus de synchronisation manuellement!" -libuserlist_sync = "Synchroniser" +[syncing] +syncing_title = "LibDB-Query Liste" +syncing_info = "Ici vous pouvez voir la liste complete des elements dans le tableau libdb-Query. Vous pouvez facilement supprimer des elements et appuyant sur 'Synchroniser', vous pouvez commencer le processus de synchronisation manuellement!" +syncing_sync = "Synchroniser" shard_online = "Le shard semble etre ligne , la synchronisation manuellement est possible: " shard_offline = "Le shard semble etre deconnecte , la synchronisation manuellement n' est pas possible!" members = "Membres" @@ -20,10 +20,59 @@ name = "Nom" email = "Email" action = "Action" -[createticket] +[show_ticket] +t_title = "Billet" +title = "Titre" +t_reply = "Repondre a billet" +t_fill = "Remplissez votre reponse" +t_send = "Envoyer la reponse" +invalid_sgroup = "Invalide support group!" +ticket_not_existing = "c'est un billet invalide" +success_forwarded = "ce billet est renvoyee bien!" +public_sgroup = "Publique" +not_assigned = "Ne rien" [show_user] +[show_queue] +not_assigned = "Libre" +success_assigned = "Ce billet est succesfull assignee!" +success_unassigned = "Ce billet est succesful unassignee!" +ticket_not_existing = "ce billet n'existe pas!" +ticket_already_assigned = "Ce billet est deja assigne a quelqu'un autre" +ticket_not_assigned = "Ce billet n'est assigne pas" +public_sgroup = "Publique" + +[show_sgroup] +add_to_group_success = "ce user est ajoute sur la groupe!" +user_already_added = "cet user est deja membre de la groupe!" +group_not_existing = "cet Groupe n' existe pas!" +user_not_existing = "cet user n'existe pas" +not_mod_or_admin = "C'est possible d'ajoute seulement des mods et admins!" + +[sgroup_list] +group_success = "le group est cree!" +group_name_taken = "le nom pour le group est deja utilise!" +group_tag_taken = "le tag pour le group est deja utilise!" +group_size_error = "le nom doit etre 4-20 chars et le tag 2-4!" + +[createticket] + +[show_reply] + +[show_ticket_log] + +[ticket_log] +1 = "a cree le billet" +2 = "a cree le billet pour" +3 = "a lire le billet" +4 = "a ajoute le reponse" +5 = "change le status a" +6 = "change le priorite a" +7 = "assigne ce billet a ce meme" +8 = "a eenvoyee ce ticket a la groupe de support:" + + [error] title404 = "Pas
    trouvez!" title403 = "Interdit!" diff --git a/code/ryzom/tools/server/ryzom_ams/assets/android_app/Ryzom_Core_AMS.7z b/code/ryzom/tools/server/ryzom_ams/assets/android_app/Ryzom_Core_AMS.7z new file mode 100644 index 0000000000000000000000000000000000000000..ed9366564e343e913875e366b358700ed10b93e5 GIT binary patch literal 25758 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

    OzVa@vL6)9JSu@#gz&p_wKkigk-C zWc0CrS%1)Sg1q%-e&ky}t7KSO*&?oebDLE7g0J|n@zkwv0LZD)0(yk*|_+( zTC>VHVShU3(wxep^O55ks`&+&AVDg_hok7>u@I%0K!%J!cKoa|>D3EA{Pz)ilJcJr zg?=vzAY!APHaCeFg$i$E7ytkal&1;-nu`l+000mA2O0nX literal 0 HcmV?d00001 diff --git a/code/ryzom/tools/server/ryzom_ams/assets/android_app/info.txt b/code/ryzom/tools/server/ryzom_ams/assets/android_app/info.txt new file mode 100644 index 000000000..ef44bdf75 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/assets/android_app/info.txt @@ -0,0 +1 @@ +Info: Android Application Made by Matthew Lagoe for browsing the AMS on your android device! diff --git a/code/ryzom/tools/server/ryzom_ams/www/config.php b/code/ryzom/tools/server/ryzom_ams/www/config.php index d68ac18de..82c010e58 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/config.php +++ b/code/ryzom/tools/server/ryzom_ams/www/config.php @@ -10,13 +10,13 @@ $cfg['db']['web']['host'] = 'localhost'; $cfg['db']['web']['port'] = '3306'; $cfg['db']['web']['name'] = 'ryzom_ams'; -$cfg['db']['web']['user'] = 'root'; +$cfg['db']['web']['user'] = 'shard'; $cfg['db']['web']['pass'] = ''; $cfg['db']['lib']['host'] = 'localhost'; $cfg['db']['lib']['port'] = '3306'; $cfg['db']['lib']['name'] = 'ryzom_ams_lib'; -$cfg['db']['lib']['user'] = 'root'; +$cfg['db']['lib']['user'] = 'shard'; $cfg['db']['lib']['pass'] = ''; $cfg['db']['shard']['host'] = 'localhost'; @@ -25,6 +25,27 @@ $cfg['db']['shard']['name'] = 'nel'; $cfg['db']['shard']['user'] = 'shard'; $cfg['db']['shard']['pass'] = ''; +$cfg['db']['ring']['host'] = 'localhost'; +$cfg['db']['ring']['port'] = '3306'; +$cfg['db']['ring']['name'] = 'ring_open'; +$cfg['db']['ring']['user'] = 'shard'; +$cfg['db']['ring']['pass'] = ''; + +$cfg['mail']['username'] = 'amsryzom@gmail.com'; +$cfg['mail']['password'] = 'lol123bol'; +$cfg['mail']['host'] = 'ryzomcore.com'; + +// To connect to an IMAP server running on port 143 on the local machine, +// do the following: $mbox = imap_open("{localhost:143}INBOX", "user_id", "password"); +// POP3 server on port 110: $mbox = imap_open ("{localhost:110/pop3}INBOX", "user_id", "password"); +// SSL IMAP or POP3 server, add /ssl after the protocol: $mbox = imap_open ("{localhost:993/imap/ssl}INBOX", "user_id", "password"); +// To connect to an SSL IMAP or POP3 server with a self-signed certificate, +// add /ssl/novalidate-cert after the protocol specification: +// $mbox = imap_open ("{localhost:995/pop3/ssl/novalidate-cert}", "user_id", "password"); +// NNTP server on port 119 use: $nntp = imap_open ("{localhost:119/nntp}comp.test", "", ""); +// To connect to a remote server replace "localhost" with the name or the IP address of the server you want to connect to. +//$cfg['mail']['server'] = '{localhost:110/pop3/novalidate-cert}INBOX'; +$cfg['mail']['server']= '{imap.gmail.com:993/imap/ssl}INBOX'; //----------------------------------------------------------------------------------------- // If true= the server will add automatically unknown user in the database // (in nel.user= nel.permission= ring.ring_user and ring.characters @@ -40,3 +61,9 @@ $AMS_CACHEDIR = $AMS_LIB . '/cache'; $DEFAULT_LANGUAGE = 'en'; $SITEBASE = dirname( __FILE__ ) . '/html/' ; + +$TICKET_LOGGING = true; +$TICKET_MAILING_SUPPORT = true; +$TIME_FORMAT = "m-d-Y H:i:s"; +$INGAME_LAYOUT = "basic"; +$MAIL_DIR = "/tmp"; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php b/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php index 6c22c57f8..014864e2a 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php @@ -1,6 +1,28 @@ uId = $UId; + } + + public function set($values){ + $this->uId = $values['UId']; + $this->login = $values['Login']; + $this->email = $values['Email']; + $this->firstname = $values['FirstName']; + $this->lastname = $values['LastName']; + $this->gender = $values['Gender']; + $this->country = $values['Country']; + } /** * Function checkUserNameExists @@ -9,8 +31,7 @@ class WebUsers extends Users{ * @return string Info: Returns true or false if the user is in the web db. */ protected function checkUserNameExists($username){ - global $cfg; - $dbw = new DBLayer($cfg['db']['web']); + $dbw = new DBLayer("web"); return $dbw->execute("SELECT * FROM ams_user WHERE Login = :name",array('name' => $username))->rowCount(); } @@ -22,8 +43,7 @@ class WebUsers extends Users{ * @return string Info: Returns true or false if the user is in the www db. */ protected function checkEmailExists($email){ - global $cfg; - $dbw = new DBLayer($cfg['db']['web']); + $dbw = new DBLayer("web"); return $dbw->execute("SELECT * FROM ams_user WHERE Email = :email",array('email' => $email))->rowCount(); } @@ -35,9 +55,7 @@ class WebUsers extends Users{ * @return string Info: Returns true or false if a login match is found in the web db */ public function checkLoginMatch($username,$password){ - global $cfg; - - $dbw = new DBLayer($cfg['db']['web']); + $dbw = new DBLayer("web"); $statement = $dbw->execute("SELECT * FROM ams_user WHERE Login=:user", array('user' => $username)); $row = $statement->fetch(); @@ -49,42 +67,57 @@ class WebUsers extends Users{ return "fail"; } } - - public function getId($username){ - global $cfg; - - $dbw = new DBLayer($cfg['db']['web']); - $statement = $dbw->execute("SELECT * FROM ams_user WHERE Login=:username", array('username' => $username)); - $row = $statement->fetch(); - return $row['UId']; + + //returns te id for a given username + public static function getId($username){ + $dbw = new DBLayer("web"); + $statement = $dbw->execute("SELECT * FROM ams_user WHERE Login=:username", array('username' => $username)); + $row = $statement->fetch(); + return $row['UId']; + } + + //returns te id for a given username + public static function getIdFromEmail($email){ + $dbw = new DBLayer("web"); + $statement = $dbw->execute("SELECT * FROM ams_user WHERE Email=:email", array('email' => $email)); + $row = $statement->fetch(); + return $row['UId']; + } + + public function getUId(){ + return $this->uId; + } + + public function getUsername(){ + $dbw = new DBLayer("web"); + if(! isset($this->login) || $this->login == ""){ + $statement = $dbw->execute("SELECT * FROM ams_user WHERE UId=:id", array('id' => $this->uId)); + $row = $statement->fetch(); + $this->set($row); + } + return $this->login; } - public function getUsername($id){ - global $cfg; - - $dbw = new DBLayer($cfg['db']['web']); - $statement = $dbw->execute("SELECT * FROM ams_user WHERE UId=:id", array('id' => $id)); - $row = $statement->fetch(); - return $row['Login']; + public function getEmail(){ + $dbw = new DBLayer("web"); + if(! isset($this->email) || $this->email == ""){ + $statement = $dbw->execute("SELECT * FROM ams_user WHERE UId=:id", array('id' => $this->uId)); + $row = $statement->fetch(); + $this->set($row); + } + return $this->email; } - public function getEmail($id){ - global $cfg; - - $dbw = new DBLayer($cfg['db']['web']); - $statement = $dbw->execute("SELECT * FROM ams_user WHERE UId=:id", array('id' => $id)); - $row = $statement->fetch(); - return $row['Email']; - } - - public function getInfo($id){ - global $cfg; - - $dbw = new DBLayer($cfg['db']['web']); - $statement = $dbw->execute("SELECT * FROM ams_user WHERE UId=:id", array('id' => $id)); - $row = $statement->fetch(); - $result = Array('FirstName' => $row['FirstName'], 'LastName' => $row['LastName'], 'Gender' => $row['Gender'], 'Country' => $row['Country']); - return $result; + public function getInfo(){ + $dbw = new DBLayer("web"); + if(! (isset($this->firstname) && isset($this->lastname) && isset($this->gender) && isset($this->country) ) || + $this->firstname == "" || $this->lastname == "" || $this->gender == "" || $this->country == ""){ + $statement = $dbw->execute("SELECT * FROM ams_user WHERE UId=:id", array('id' => $this->uId)); + $row = $statement->fetch(); + $this->set($row); + } + $result = Array('FirstName' => $this->firstname, 'LastName' => $this->lastname, 'Gender' => $this->gender, 'Country' => $this->country); + return $result; } public function isLoggedIn(){ @@ -94,20 +127,12 @@ class WebUsers extends Users{ return false; } - public function isAdmin(){ - if(isset($_SESSION['permission']) && $_SESSION['permission'] == 2){ - return true; - } - return false; - } - public function setPassword($user, $pass){ - global $cfg; $reply = WebUsers::setAmsPassword($user, $pass); $values = Array('user' => $user, 'pass' => $pass); try { //make connection with and put into shard db - $dbw = new DBLayer($cfg['db']['web']); + $dbw = new DBLayer("web"); $dbw->execute("UPDATE ams_user SET Password = :pass WHERE Login = :user ",$values); } catch (PDOException $e) { @@ -117,12 +142,11 @@ class WebUsers extends Users{ } public function setEmail($user, $mail){ - global $cfg; $reply = WebUsers::setAmsEmail($user, $mail); $values = Array('user' => $user, 'mail' => $mail); try { //make connection with and put into shard db - $dbw = new DBLayer($cfg['db']['web']); + $dbw = new DBLayer("web"); $dbw->execute("UPDATE ams_user SET Email = :mail WHERE Login = :user ",$values); } catch (PDOException $e) { @@ -132,9 +156,13 @@ class WebUsers extends Users{ } public function getUsers(){ - global $cfg; - $dbl = new DBLayer($cfg['db']['web']); + $dbl = new DBLayer("web"); $data = $dbl->executeWithoutParams("SELECT * FROM ams_user"); return $data; } + + public static function getAllUsersQuery(){ + return "SELECT * FROM ams_user"; + } + } \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/add_sgroup.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/add_sgroup.php new file mode 100644 index 000000000..9fc59d917 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/add_sgroup.php @@ -0,0 +1,34 @@ +getPermission(); + $result['no_visible_elements'] = 'FALSE'; + $result['username'] = $_SESSION['user']; + global $SITEBASE; + require_once($SITEBASE . 'inc/sgroup_list.php'); + $result= array_merge($result, sgroup_list()); + helpers :: loadtemplate( 'sgroup_list', $result); + exit; + + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user.php index e21e32d6a..7e81b2751 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user.php @@ -3,7 +3,7 @@ function add_user(){ $params = Array('Username' => $_POST["Username"], 'Password' => $_POST["Password"], 'ConfirmPass' => $_POST["ConfirmPass"], 'Email' => $_POST["Email"]); - $webUser = new WebUsers; + $webUser = new WebUsers(); $result = $webUser->check_Register($params); // if all are good then create user @@ -47,9 +47,8 @@ function write_user($newUser){ ); try{ - global $cfg; //make connection with web db and put it in there - $dbw = new DBLayer($cfg['db']['web']); + $dbw = new DBLayer("web"); $user_id = $dbw->executeReturnId("INSERT INTO ams_user (Login, Password, Email) VALUES (:name, :pass, :mail)",$params); //Create the user on the shard + in case shard is offline put copy of query in query db diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user_to_sgroup.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user_to_sgroup.php new file mode 100644 index 000000000..3eb79b928 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user_to_sgroup.php @@ -0,0 +1,42 @@ +getPermission()>1){ + $result['RESULT_OF_ADDING'] = Support_Group::addUserToSupportGroup($user_id, $id); + }else{ + $result['RESULT_OF_ADDING'] = "NOT_MOD_OR_ADMIN"; + } + + }else{ + $result['RESULT_OF_ADDING'] = "USER_NOT_EXISTING"; + } + $result['permission'] = $_SESSION['ticket_user']->getPermission(); + $result['no_visible_elements'] = 'FALSE'; + $result['username'] = $_SESSION['user']; + global $SITEBASE; + require_once($SITEBASE . 'inc/show_sgroup.php'); + $result= array_merge($result, show_sgroup()); + helpers :: loadtemplate( 'show_sgroup', $result); + exit; + + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/change_info.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_info.php index baf28afc2..311935e9c 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/func/change_info.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_info.php @@ -9,16 +9,17 @@ function change_info(){ if(isset($_POST['target_id'])){ - if( ($_POST['target_id'] == $_SESSION['id']) || WebUsers::isAdmin() ){ + if( ($_POST['target_id'] == $_SESSION['id']) || Ticket_User::isMod($_SESSION['ticket_user'] ) ){ if($_POST['target_id'] == $_SESSION['id']){ $target_username = $_SESSION['user']; }else{ - $target_username = WebUsers::getUsername($_POST['target_id']); + $webUser = new WebUsers($_POST['target_id']); + $target_username = $webUser->getUsername(); } - $webUser = new WebUsers(); + $webUser = new WebUsers($_POST['target_id']); //use current info to check for changes - $current_info = $webUser->getInfo($_POST['target_id']); + $current_info = $webUser->getInfo(); $current_info['FirstName'] = filter_var($current_info['FirstName'], FILTER_SANITIZE_STRING); @@ -70,9 +71,8 @@ function change_info(){ //if some field is update then: if($updated){ - global $cfg; //execute the query in the web DB. - $dbw = new DBLayer($cfg['db']['web']); + $dbw = new DBLayer("web"); $dbw->execute($query,$values); } @@ -82,7 +82,7 @@ function change_info(){ if($updated){ $result['info_updated'] = "OK"; } - $result['permission'] = $_SESSION['permission']; + $result['permission'] = $_SESSION['ticket_user']->getPermission(); $result['username'] = $_SESSION['user']; $result['no_visible_elements'] = 'FALSE'; $result['target_id'] = $_POST['target_id']; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/change_mail.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_mail.php index 6905febae..ac24fa5b0 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/func/change_mail.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_mail.php @@ -9,14 +9,15 @@ function change_mail(){ if(isset($_POST['target_id'])){ - if( ($_POST['target_id'] == $_SESSION['id']) || WebUsers::isAdmin() ){ + if( ($_POST['target_id'] == $_SESSION['id']) || Ticket_User::isMod($_SESSION['ticket_user']) ){ if($_POST['target_id'] == $_SESSION['id']){ $target_username = $_SESSION['user']; }else{ - $target_username = WebUsers::getUsername($_POST['target_id']); + $webUser = new WebUsers($_POST['target_id']); + $target_username = $webUser->getUsername(); } - $webUser = new WebUsers(); + $webUser = new WebUsers($_POST['target_id']); $reply = $webUser->checkEmail($_POST['NewEmail']); global $SITEBASE; @@ -37,13 +38,13 @@ function change_mail(){ }else if($status == 'shardoffline'){ $result['SUCCESS_MAIL'] = "SHARDOFF"; } - $result['permission'] = $_SESSION['permission']; + $result['permission'] = $_SESSION['ticket_user']->getPermission(); $result['no_visible_elements'] = 'FALSE'; $result['username'] = $_SESSION['user']; $result['target_id'] = $_POST['target_id']; if(isset($_GET['id'])){ - if(WebUsers::isAdmin() && ($_POST['target_id'] != $_SESSION['id'])){ - $result['isAdmin'] = "TRUE"; + if(Ticket_User::isMod($_SESSION['ticket_user']) && ($_POST['target_id'] != $_SESSION['id'])){ + $result['isMod'] = "TRUE"; } } helpers :: loadtemplate( 'settings', $result); @@ -51,13 +52,13 @@ function change_mail(){ }else{ $result['EMAIL'] = $reply; - $result['permission'] = $_SESSION['permission']; + $result['permission'] = $_SESSION['ticket_user']->getPermission(); $result['no_visible_elements'] = 'FALSE'; $result['username'] = $_SESSION['user']; $result['target_id'] = $_POST['target_id']; if(isset($_GET['id'])){ - if(WebUsers::isAdmin() && ($_POST['target_id'] != $_SESSION['id'])){ - $result['isAdmin'] = "TRUE"; + if(Ticket_User::isMod($_SESSION['ticket_user']) && ($_POST['target_id'] != $_SESSION['id'])){ + $result['isMod'] = "TRUE"; } } helpers :: loadtemplate( 'settings', $result); diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/change_password.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_password.php index 57e675123..b3971202d 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/func/change_password.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_password.php @@ -9,17 +9,18 @@ function change_password(){ if(isset($_POST['target_id'])){ $adminChangesOther = false; //if target_id is the same as session id or is admin - if( ($_POST['target_id'] == $_SESSION['id']) || WebUsers::isAdmin() ){ + if( ($_POST['target_id'] == $_SESSION['id']) || Ticket_User::isMod($_SESSION['ticket_user']) ){ if($_POST['target_id'] == $_SESSION['id']){ $target_username = $_SESSION['user']; }else{ - $target_username = WebUsers::getUsername($_POST['target_id']); + $webUser = new WebUsers($_POST['target_id']); + $target_username = $webUser->getUsername(); //isAdmin is true when it's the admin, but the target_id != own id $adminChangesOther = true; $_POST["CurrentPass"] = "dummypass"; } - $webUser = new WebUsers(); + $webUser = new WebUsers($_POST['target_id']); $params = Array( 'user' => $target_username, 'CurrentPass' => $_POST["CurrentPass"], 'NewPass' => $_POST["NewPass"], 'ConfirmNewPass' => $_POST["ConfirmNewPass"], 'adminChangesOther' => $adminChangesOther); $result = $webUser->check_change_password($params); if ($result == "success"){ @@ -34,7 +35,7 @@ function change_password(){ }else if($status == 'shardoffline'){ $succresult['SUCCESS_PASS'] = "SHARDOFF"; } - $succresult['permission'] = $_SESSION['permission']; + $succresult['permission'] = $_SESSION['ticket_user']->getPermission(); $succresult['no_visible_elements'] = 'FALSE'; $succresult['username'] = $_SESSION['user']; $succresult['target_id'] = $_POST['target_id']; @@ -46,7 +47,7 @@ function change_password(){ $result['prevCurrentPass'] = filter_var($_POST["CurrentPass"], FILTER_SANITIZE_STRING); $result['prevNewPass'] = filter_var($_POST["NewPass"], FILTER_SANITIZE_STRING); $result['prevConfirmNewPass'] = filter_var($_POST["ConfirmNewPass"], FILTER_SANITIZE_STRING); - $result['permission'] = $_SESSION['permission']; + $result['permission'] = $_SESSION['ticket_user']->getPermission(); $result['no_visible_elements'] = 'FALSE'; $result['username'] = $_SESSION['user']; $result['target_id'] = $_POST['target_id']; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/create_ticket.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/create_ticket.php index 8f8010889..af51c6969 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/func/create_ticket.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/create_ticket.php @@ -7,9 +7,8 @@ function create_ticket(){ if(isset($_POST['target_id'])){ //if target_id is the same as session id or is admin - if( ($_POST['target_id'] == $_SESSION['id']) || WebUsers::isAdmin() ){ + if( ($_POST['target_id'] == $_SESSION['id']) || Ticket_User::isMod($_SESSION['ticket_user']) ){ - global $cfg; $category = filter_var($_POST['Category'], FILTER_SANITIZE_NUMBER_INT); $title = filter_var($_POST['Title'], FILTER_SANITIZE_STRING); $content = filter_var($_POST['Content'], FILTER_SANITIZE_STRING); @@ -17,11 +16,16 @@ function create_ticket(){ if($_POST['target_id'] == $_SESSION['id']){ $author = $_SESSION['ticket_user']->getTUserId(); }else{ - $author= Ticket_User::constr_ExternId($_POST['target_id'], $cfg['db']['lib'])->getTUserId(); + $author= Ticket_User::constr_ExternId($_POST['target_id'])->getTUserId(); } - Ticket::create_Ticket($title, $content, $category, $author, $cfg['db']['lib'] ); + $ticket_id = Ticket::create_Ticket($title, $content, $category, $author, $_SESSION['ticket_user']->getTUserId()); + header("Location: index.php?page=show_ticket&id=".$ticket_id); + exit; + }catch (PDOException $e) { //ERROR: LIB DB is not online! + print_r($e); + exit; header("Location: index.php"); exit; } @@ -35,7 +39,7 @@ function create_ticket(){ }else{ //ERROR: The form was not filled in correclty - header("Location: index.php?page=settings"); + header("Location: index.php?page=create_ticket"); exit; } }else{ diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/login.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/login.php index eb9be221f..49ef2a435 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/func/login.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/login.php @@ -2,16 +2,15 @@ function login(){ - global $cfg; - try{ - $result = WebUsers::checkLoginMatch($_POST["Username"],$_POST["Password"]); + $username = filter_var($_POST['Username'],FILTER_SANITIZE_STRING); + $password = filter_var($_POST['Password'],FILTER_SANITIZE_STRING); + $result = WebUsers::checkLoginMatch($username, $password); if( $result != "fail"){ //handle successful login - $_SESSION['user'] = $_POST["Username"]; - $_SESSION['permission'] = $result['Permission']; + $_SESSION['user'] = $username; $_SESSION['id'] = $result['UId']; - $_SESSION['ticket_user'] = Ticket_User::constr_ExternId($result['UId'],$cfg['db']['lib']); + $_SESSION['ticket_user'] = Ticket_User::constr_ExternId($result['UId']); //go back to the index page. header( 'Location: index.php' ); diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/reply_on_ticket.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/reply_on_ticket.php new file mode 100644 index 000000000..76f8ee71e --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/reply_on_ticket.php @@ -0,0 +1,51 @@ +load_With_TId($ticket_id); + + if(($target_ticket->getAuthor() == $_SESSION['ticket_user']->getTUserId()) || Ticket_User::isMod($_SESSION['ticket_user']) ){ + + try{ + $author = $_SESSION['ticket_user']->getTUserId(); + + $content = $_POST['Content']; + $hidden = 0; + if(isset($_POST['hidden']) && Ticket_User::isMod($_SESSION['ticket_user'])){ + $hidden = 1; + } + Ticket::createReply($content, $author, $ticket_id, $hidden); + + if(isset($_POST['ChangeStatus']) && isset($_POST['ChangePriority']) && Ticket_User::isMod($_SESSION['ticket_user'])){ + $newStatus = filter_var($_POST['ChangeStatus'], FILTER_SANITIZE_NUMBER_INT); + $newPriority = filter_var($_POST['ChangePriority'], FILTER_SANITIZE_NUMBER_INT); + Ticket::updateTicketStatusAndPriority($ticket_id,$newStatus, $newPriority, $author); + } + header("Location: index.php?page=show_ticket&id=".$ticket_id); + exit; + + }catch (PDOException $e) { + //ERROR: LIB DB is not online! + print_r($e); + //header("Location: index.php"); + exit; + } + + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/img/ryzomcore_166_62.png b/code/ryzom/tools/server/ryzom_ams/www/html/img/ryzomcore_166_62.png new file mode 100644 index 0000000000000000000000000000000000000000..d210203d9489c7003ed95d2c56c473573d8c5390 GIT binary patch literal 16654 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/change_permission.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/change_permission.php new file mode 100644 index 000000000..084aa3923 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/change_permission.php @@ -0,0 +1,40 @@ +getTUserId(), $value); + header("Location: index.php?page=show_user&id=".$user_id); + exit; + + + }else{ + //ERROR: GET PARAMS not given or trying to change admin + header("Location: index.php?page=show_user&id=".$user_id); + exit; + } + + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + + } + + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } + + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/createticket.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/createticket.php index 4647bbfaf..4c3dce7b8 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/inc/createticket.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/createticket.php @@ -7,7 +7,7 @@ function createticket(){ //in case user_id-GET param set it's value as target_id, if no user_id-param is given, use the session id. if(isset($_GET['user_id'])){ - if(($_GET['user_id'] != $_SESSION['id']) && (!WebUsers::isAdmin()) ){ + if(($_GET['user_id'] != $_SESSION['id']) && ( ! ticket_user::isMod($_SESSION['ticket_user'])) ){ //ERROR: No access! $_SESSION['error_code'] = "403"; @@ -27,13 +27,8 @@ function createticket(){ } //create array of category id & names - global $cfg; - $catArray = Ticket_Category::getAllCategories($cfg['db']['lib']); - $result['category'] = Array(); - foreach($catArray as $catObj){ - $result['category'][$catObj->getTCategoryId()] = $catObj->getName(); - } - + $catArray = Ticket_Category::getAllCategories(); + $result['category'] = Gui_Elements::make_table_with_key_is_id($catArray, Array("getName"), "getTCategoryId" ); return $result; }else{ diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/libuserlist.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/libuserlist.php deleted file mode 100644 index f7351e4d5..000000000 --- a/code/ryzom/tools/server/ryzom_ams/www/html/inc/libuserlist.php +++ /dev/null @@ -1,68 +0,0 @@ -executeWithoutParams("SELECT * FROM ams_querycache")->rowCount(); - - //the array hat will contain all users - $pageResult['liblist'] = Array(); - if($rows > 0){ - //This is the number of results displayed per page - $page_rows = 2; - - //This tells us the page number of our last page - $last = ceil($rows/$page_rows); - - //this makes sure the page number isn't below one, or more than our maximum pages - if ($pagenum < 1) - { - $pagenum = 1; - }else if ($pagenum > $last) { - $pagenum = $last; - } - - //This sets the range to display in our query - $max = 'limit ' .($pagenum - 1) * $page_rows .',' .$page_rows; - - //This is your query again, the same one... the only difference is we add $max into it - $data = $dbl->executeWithoutParams("SELECT * FROM ams_querycache $max"); - - //This is where we put the results in a resultArray to be sent to smarty - - $i = 0; - while($row = $data->fetch(PDO::FETCH_ASSOC)){ - $decode = json_decode($row['query']); - $pageResult['liblist'][$i]['id'] = $row['SID']; - $pageResult['liblist'][$i]['type'] = $row['type']; - //$pageResult['liblist'][$i]['name'] = $decode[0]; - //$pageResult['liblist'][$i]['mail'] = $decode[2]; - $i++; - } - } - - //check if shard is online - try{ - $dbs = new DBLayer($cfg['db']['shard']); - $pageResult['shard'] = "online"; - }catch(PDOException $e) { - $pageResult['shard'] = "offline"; - } - return $pageResult; - }else{ - //ERROR: No access! - $_SESSION['error_code'] = "403"; - header("Location: index.php?page=error"); - exit; - } -} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/login.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/login.php new file mode 100644 index 000000000..38a9ab5d8 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/login.php @@ -0,0 +1,16 @@ +getInfo(); + if(Ticket_User::isMod($_SESSION['ticket_user']) && ($_GET['id']!= $_SESSION['id'])){ + $result['changesOther'] = "TRUE"; } $result['target_id'] = $_GET['id']; - $result['current_mail'] = WebUsers::getEmail($_GET['id']); + $result['current_mail'] = $webUser->getEmail(); } }else{ - $result = WebUsers::getInfo($_SESSION['id']); + $webUser = new Webusers($_SESSION['id']); + $result = $webUser->getInfo(); $result['target_id'] = $_SESSION['id']; - $result['current_mail'] = WebUsers::getEmail($_SESSION['id']); + $result['current_mail'] = $webUser->getEmail(); //Sanitize Data $result['current_mail'] = filter_var($result['current_mail'], FILTER_SANITIZE_EMAIL); diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/sgroup_list.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/sgroup_list.php new file mode 100644 index 000000000..3d380c2d2 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/sgroup_list.php @@ -0,0 +1,31 @@ +getTUserId(); + $queueArray = array(); + $queue_handler = new Ticket_Queue_handler(); + + //Pagination Base Links + $result['pagination_base_link'] = "index.php?page=show_queue&get=".$result['queue_view'] ; + + if(isset($_GET['get']) && ($_GET['get'] == "create") && isset($_GET['userid']) && isset($_GET['groupid']) && isset($_GET['what']) && isset($_GET['how']) && isset($_GET['who'])){ + $userid = filter_var($_GET['userid'], FILTER_SANITIZE_NUMBER_INT); + $groupid = filter_var($_GET['groupid'], FILTER_SANITIZE_NUMBER_INT); + $what = filter_var($_GET['what'], FILTER_SANITIZE_STRING); + $how = filter_var($_GET['how'], FILTER_SANITIZE_STRING); + $who = filter_var($_GET['who'], FILTER_SANITIZE_STRING); + $queue_handler->CreateQueue($userid, $groupid, $what, $how, $who); + $result['pagination_base_link'] = "index.php?page=show_queue&get=create&userid=".$userid."&groupid=".$groupid."&what=".$what."&how=".$how."&who=".$who; + $result['prev_created_userid'] = $userid; + $result['prev_created_groupid'] = $groupid; + $result['prev_created_what'] = $what; + $result['prev_created_how'] = $how; + $result['prev_created_who'] = $who; + } + + //if an action is set + if(isset($_POST['action'])){ + switch($_POST['action']){ + case "assignTicket": + $ticket_id = filter_var($_POST['ticket_id'], FILTER_SANITIZE_NUMBER_INT); + $result['ACTION_RESULT'] = Ticket::assignTicket($user_id, $ticket_id); + break; + + case "unAssignTicket": + $ticket_id = filter_var($_POST['ticket_id'], FILTER_SANITIZE_NUMBER_INT); + $result['ACTION_RESULT'] = Ticket::unAssignTicket($user_id, $ticket_id); + break; + + case "create_queue": + $userid = filter_var($_POST['userid'], FILTER_SANITIZE_NUMBER_INT); + $groupid = filter_var($_POST['groupid'], FILTER_SANITIZE_NUMBER_INT); + $what = filter_var($_POST['what'], FILTER_SANITIZE_STRING); + $how = filter_var($_POST['how'], FILTER_SANITIZE_STRING); + $who = filter_var($_POST['who'], FILTER_SANITIZE_STRING); + $queue_handler->CreateQueue($userid, $groupid, $what, $how, $who); + $result['pagination_base_link'] = "index.php?page=show_queue&get=create&userid=".$userid."&groupid=".$groupid."&what=".$what."&how=".$how."&who=".$who; + $result['prev_created_userid'] = $userid; + $result['prev_created_groupid'] = $groupid; + $result['prev_created_what'] = $what; + $result['prev_created_how'] = $how; + $result['prev_created_who'] = $who; + + + + + break; + + } + } + + $queueArray = $queue_handler->getTickets($result['queue_view'], $user_id); + + //pagination + $result['links'] = $queue_handler->getPagination()->getLinks(5); + $result['lastPage'] = $queue_handler->getPagination()->getLast(); + $result['currentPage'] = $queue_handler->getPagination()->getCurrent(); + + + //if queue_view is a valid parameter value + if ($queueArray != "ERROR"){ + + $result['tickets'] = Gui_Elements::make_table($queueArray, Array("getTId","getTitle","getTimestamp","getAuthor()->getExternId","getTicket_Category()->getName","getStatus","getStatusText","getAssigned","getForwardedGroupName","getForwardedGroupId"), Array("tId","title","timestamp","authorExtern","category","status","statusText","assigned","forwardedGroupName","forwardedGroupId")); + $i = 0; + foreach( $result['tickets'] as $ticket){ + $web_author = new WebUsers($ticket['authorExtern']); + $result['tickets'][$i]['author'] = $web_author->getUsername(); + $web_assigned = new WebUsers($ticket['assigned']); + $result['tickets'][$i]['assignedText'] = $web_assigned->getUsername(); + $result['tickets'][$i]['timestamp_elapsed'] = Gui_Elements::time_elapsed_string($ticket['timestamp']); + $i++; + } + $result['user_id'] = $_SESSION['ticket_user']->getTUserId(); + + //Queue creator field info + $result['grouplist'] = Gui_Elements::make_table(Support_Group::getGroups(), Array("getSGroupId","getName"), Array("sGroupId","name")); + $result['teamlist'] = Gui_Elements::make_table(Ticket_User::getModsAndAdmins(), Array("getTUserId","getExternId"), Array("tUserId","externId")); + $i = 0; + foreach( $result['teamlist'] as $member){ + $web_teammember = new Webusers($member['externId']); + $result['teamlist'][$i]['name'] = $web_teammember->getUsername(); + $i++; + } + return $result; + + }else{ + + //ERROR: Doesn't exist! + $_SESSION['error_code'] = "404"; + header("Location: index.php?page=error"); + exit; + } + + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_reply.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_reply.php new file mode 100644 index 000000000..1640c5938 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_reply.php @@ -0,0 +1,46 @@ +load_With_TReplyId($result['reply_id']); + + + $ticket = new Ticket(); + $ticket->load_With_TId($reply->getTicket()); + + if(( $ticket->getAuthor() == $_SESSION['ticket_user']->getTUserId() && ! $reply->getHidden()) || Ticket_User::isMod($_SESSION['ticket_user'] )){ + $content = new Ticket_Content(); + $content->load_With_TContentId($reply->getContent()); + + $author = new Ticket_User(); + $author->load_With_TUserId($reply->getAuthor()); + + $result['hidden'] = $reply->getHidden(); + $result['ticket_id'] = $reply->getTicket(); + $result['reply_timestamp'] = $reply->getTimestamp(); + $result['author_permission'] = $author->getPermission(); + $result['reply_content'] = $content->getContent(); + $result['author'] = $author->getExternId(); + $webUser = new WebUsers($author->getExternId()); + $result['authorName'] = $webUser->getUsername(); + if(Ticket_User::isMod($_SESSION['ticket_user'])){ + $result['isMod'] = "TRUE"; + } + return $result; + + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_sgroup.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_sgroup.php new file mode 100644 index 000000000..f4f5edd64 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_sgroup.php @@ -0,0 +1,56 @@ +getName(); + $result['userlist'] = Gui_Elements::make_table(Support_Group::getAllUsersOfSupportGroup($result['target_id']), Array("getTUserId","getPermission","getExternId"), Array("tUserId","permission","externId")); + $i = 0; + foreach( $result['userlist'] as $user){ + $webuser = new Webusers($user['externId']); + $result['userlist'][$i]['name'] = $webuser->getUsername(); + $i++; + } + return $result; + + + }else{ + + //ERROR: No page specified! + $_SESSION['error_code'] = "404"; + header("Location: index.php?page=error"); + exit; + } + + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_ticket.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_ticket.php new file mode 100644 index 000000000..3179a0e25 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_ticket.php @@ -0,0 +1,82 @@ +getTUserId(); + $result['ticket_id'] = filter_var($_GET['id'], FILTER_SANITIZE_NUMBER_INT); + $target_ticket = new Ticket(); + $target_ticket->load_With_TId($result['ticket_id']); + + if(Ticket_User::isMod($_SESSION['ticket_user'] )){ + if(isset($_POST['action'])){ + switch($_POST['action']){ + case "forward": + $ticket_id = filter_var($_POST['ticket_id'], FILTER_SANITIZE_NUMBER_INT); + $group_id = filter_var($_POST['group'], FILTER_SANITIZE_NUMBER_INT); + $result['ACTION_RESULT'] = Ticket::forwardTicket($result['user_id'], $ticket_id, $group_id); + break; + case "assignTicket": + $ticket_id = filter_var($_POST['ticket_id'], FILTER_SANITIZE_NUMBER_INT); + $result['ACTION_RESULT'] = Ticket::assignTicket($result['user_id'] , $ticket_id); + break; + case "unAssignTicket": + $ticket_id = filter_var($_POST['ticket_id'], FILTER_SANITIZE_NUMBER_INT); + $result['ACTION_RESULT'] = Ticket::unAssignTicket($result['user_id'], $ticket_id); + break; + + } + } + } + + if(($target_ticket->getAuthor() == $_SESSION['ticket_user']->getTUserId()) || Ticket_User::isMod($_SESSION['ticket_user'] )){ + + $show_as_admin = false; + if(Ticket_User::isMod($_SESSION['ticket_user'])){ + $show_as_admin = true; + } + $entire_ticket = Ticket::getEntireTicket( $result['ticket_id'],$show_as_admin); + Ticket_Log::createLogEntry($result['ticket_id'],$_SESSION['ticket_user']->getTUserId(), 3); + $result['ticket_tId'] = $entire_ticket['ticket_obj']->getTId(); + $result['ticket_forwardedGroupName'] = $entire_ticket['ticket_obj']->getForwardedGroupName(); + $result['ticket_forwardedGroupId'] = $entire_ticket['ticket_obj']->getForwardedGroupId(); + $result['ticket_title'] = $entire_ticket['ticket_obj']->getTitle(); + $result['ticket_timestamp'] = $entire_ticket['ticket_obj']->getTimestamp(); + $result['ticket_status'] = $entire_ticket['ticket_obj']->getStatus(); + $result['ticket_author'] = $entire_ticket['ticket_obj']->getAuthor(); + $result['ticket_prioritytext'] = $entire_ticket['ticket_obj']->getPriorityText(); + $result['ticket_priorities'] = Ticket::getPriorityArray(); + $result['ticket_priority'] = $entire_ticket['ticket_obj']->getPriority(); + $result['ticket_statustext'] = $entire_ticket['ticket_obj']->getStatusText(); + $result['ticket_lastupdate'] = Gui_Elements::time_elapsed_string(Ticket::getLatestReply($result['ticket_id'])->getTimestamp()); + $result['ticket_category'] = $entire_ticket['ticket_obj']->getCategoryName(); + $webUser = new WebUsers(Assigned::getUserAssignedToTicket($result['ticket_tId'])); + $result['ticket_assignedToText'] = $webUser->getUsername(); + $result['ticket_assignedTo'] = Assigned::getUserAssignedToTicket($result['ticket_tId']); + $result['ticket_replies'] = Gui_Elements::make_table($entire_ticket['reply_array'], Array("getTReplyId","getContent()->getContent","getTimestamp","getAuthor()->getExternId","getAuthor()->getPermission","getHidden"), Array("tReplyId","replyContent","timestamp","authorExtern","permission","hidden")); + $i = 0; + foreach( $result['ticket_replies'] as $reply){ + $webReplyUser = new WebUsers($reply['authorExtern']); + $result['ticket_replies'][$i]['author'] = $webReplyUser->getUsername(); + $i++; + } + if(Ticket_User::isMod($_SESSION['ticket_user'])){ + $result['isMod'] = "TRUE"; + $result['statusList'] = Ticket::getStatusArray(); + $result['sGroups'] = Gui_Elements::make_table_with_key_is_id(Support_Group::getAllSupportGroups(), Array("getName"), "getSGroupId" ); + } + return $result; + + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_ticket_log.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_ticket_log.php new file mode 100644 index 000000000..5d4cbb76b --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_ticket_log.php @@ -0,0 +1,56 @@ +load_With_TId($result['ticket_id']); + $result['ticket_title'] = $target_ticket->getTitle(); + $ticket_logs = Ticket_Log::getLogsOfTicket( $result['ticket_id']); + $log_action_array = Ticket_Log::getActionTextArray(); + $result['ticket_logs'] = Gui_Elements::make_table($ticket_logs, Array("getTLogId","getTimestamp","getAuthor()->getExternId","getAction","getArgument()"), Array("tLogId","timestamp","authorExtern","action","argument")); + $i = 0; + foreach( $result['ticket_logs'] as $log){ + $webUser = new WebUsers($log['authorExtern']); + $author = $webUser->getUsername(); + $result['ticket_logs'][$i]['author'] = $author; + $query_backpart = ""; + if($log['action'] == 2){ + $webUser2 = new WebUsers($log['argument']); + $query_backpart = $webUser2->getUsername(); + }else if($log['action'] == 4){ + $query_backpart = "ID#" . $log['argument'] . ""; + }else if($log['action'] == 5){ + $statusArray = Ticket::getStatusArray(); + $query_backpart = $statusArray[$log['argument'] ]; + }else if($log['action'] == 6){ + $priorityArray = Ticket::getPriorityArray(); + $query_backpart = $priorityArray[$log['argument'] ]; + }else if($log['action'] == 8){ + $query_backpart = "" . Support_Group::getGroup($log['argument'])->getName() . ""; + } + $result['ticket_logs'][$i]['query'] = $author . " " . $log_action_array[$log['action']] . " " . $query_backpart; + $result['ticket_logs'][$i]['timestamp_elapsed'] = Gui_Elements::time_elapsed_string($log['timestamp']); + $i++; + } + if(Ticket_User::isMod($_SESSION['ticket_user'])){ + $result['isMod'] = "TRUE"; + } + return $result; + + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_user.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_user.php index a0d9c9132..a8774ba83 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_user.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_user.php @@ -4,49 +4,30 @@ function show_user(){ //if logged in if(WebUsers::isLoggedIn()){ - if( !isset($_GET['id']) || WebUsers::isAdmin() || $_GET['id'] == $_SESSION['id'] ){ + if( !isset($_GET['id']) || Ticket_User::isMod($_SESSION['ticket_user']) || $_GET['id'] == $_SESSION['id'] ){ if(isset($_GET['id'])){ $result['target_id'] = filter_var($_GET['id'], FILTER_SANITIZE_NUMBER_INT); }else{ $result['target_id'] = $_SESSION['id']; } - $result['target_name'] = WebUsers::getUsername( $result['target_id']); - $result['mail'] = WebUsers::getEmail( $result['target_id']); - $info = WebUsers::getInfo($result['target_id']); + $webUser = new WebUsers($result['target_id']); + $result['target_name'] = $webUser->getUsername(); + $result['mail'] = $webUser->getEmail(); + $info = $webUser->getInfo(); $result['firstName'] = $info['FirstName']; $result['lastName'] = $info['LastName']; $result['country'] = $info['Country']; $result['gender'] = $info['Gender']; - global $cfg; - $ticket_user = Ticket_User::constr_ExternId($result['target_id'],$cfg['db']['lib']); - $ticketlist = Ticket::getTicketsOf($ticket_user->getTUserId(),$cfg['db']['lib']); - $i = 0; - $result['ticketlist'] = Array(); - foreach($ticketlist as $ticket){ - $result['ticketlist'][$i]['tId'] = $ticket->getTId(); - $result['ticketlist'][$i]['timestamp'] = $ticket->getTimestamp(); - $result['ticketlist'][$i]['title'] = $ticket->getTitle(); - - //get the status - $statusId = $ticket->getStatus(); - if ($statusId == 0){ - $status = "Waiting on support.."; - }else if($statusId == 1){ - $status = "Being handled.."; - }else if($statusId == 2){ - $status = "Closed"; - } - - $result['ticketlist'][$i]['statusText'] = $status; - $result['ticketlist'][$i]['status'] = $statusId; - //get the category - $category = Ticket_Category::constr_TCategoryId($ticket->getTicket_Category(), $cfg['db']['lib']); - $result['ticketlist'][$i]['category'] = $category->getName(); - $i++; + $ticket_user = Ticket_User::constr_ExternId($result['target_id']); + $result['userPermission'] = $ticket_user->getPermission(); + if(Ticket_User::isAdmin($_SESSION['ticket_user'])){ + $result['isAdmin'] = "TRUE"; } + $ticketlist = Ticket::getTicketsOf($ticket_user->getTUserId()); + $result['ticketlist'] = Gui_Elements::make_table($ticketlist, Array("getTId","getTimestamp","getTitle","getStatus","getStatusText","getStatusText","getCategoryName"), Array("tId","timestamp","title","status","statustext","statusText","category")); return $result; }else{ diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/syncing.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/syncing.php new file mode 100644 index 000000000..bca38bd74 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/syncing.php @@ -0,0 +1,28 @@ +getElements() , Array("getSID","getType"), Array("id","type")); + $pageResult['links'] = $pagination->getLinks(5); + $pageResult['lastPage'] = $pagination->getLast(); + $pageResult['currentPage'] = $pagination->getCurrent(); + + + //check if shard is online + try{ + $dbs = new DBLayer("shard"); + $pageResult['shard'] = "online"; + }catch(PDOException $e) { + $pageResult['shard'] = "offline"; + } + return $pageResult; + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/userlist.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/userlist.php index e2c2cbfcb..9e4c8a079 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/inc/userlist.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/userlist.php @@ -1,17 +1,23 @@ getElements() , Array("getUId","getUsername","getEmail"), Array("id","username","email")); + $pageResult['links'] = $pagination->getLinks(5); + $pageResult['lastPage'] = $pagination->getLast(); + $pageResult['currentPage'] = $pagination->getCurrent(); + $i = 0; - $pageResult['userlist'] = Array(); - while($row = $users->fetch(PDO::FETCH_ASSOC)){ - $pageResult['userlist'][$i]['id'] = $row['UId']; - $pageResult['userlist'][$i]['username'] = $row['Login']; - $pageResult['userlist'][$i]['permission'] = $row['Permission']; - $pageResult['userlist'][$i]['email'] = $row['Email']; + foreach( $pageResult['userlist'] as $user ){ + $pageResult['userlist'][$i]['permission'] = Ticket_User::constr_ExternId($pageResult['userlist'][$i]['id'])->getPermission(); $i++; } + + if (Ticket_User::isAdmin($_SESSION['ticket_user'])){ + $pageResult['isAdmin'] = "TRUE"; + } return $pageResult; }else{ //ERROR: No access! diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/index.php b/code/ryzom/tools/server/ryzom_ams/www/html/index.php index 040989bbb..b14cbb40c 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/index.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/index.php @@ -6,11 +6,15 @@ require( '../../ams_lib/libinclude.php' ); session_start(); //Decide what page to load -if(isset($_SESSION['user'])){ - $page = 'home'; +if ( ! isset( $_GET["page"]) ){ + if(isset($_SESSION['user'])){ + $page = 'home'; + }else{ + //default page + $page = 'login'; + } }else{ - //default page - $page = 'login'; + $page = $_GET["page"]; } //perform an action in case one is specified @@ -18,13 +22,12 @@ if(isset($_SESSION['user'])){ if ( isset( $_POST["function"] ) ){ require( "func/" . $_POST["function"] . ".php" ); $return = $_POST["function"](); -}else if ( isset( $_GET["page"] ) ){ - $filename = 'inc/' . $_GET["page"] . '.php'; +}else{ + $filename = 'inc/' . $page . '.php'; if(is_file($filename)){ require_once($filename); - $return = $_GET["page"](); + $return = $page(); } - $page = $_GET["page"]; } //add username to the return array in case logged in. @@ -36,8 +39,8 @@ if(isset($_SESSION['user'])){ //Set permission -if(isset($_SESSION['permission'])){ - $return['permission'] = $_SESSION['permission']; +if(isset($_SESSION['ticket_user'])){ + $return['permission'] = $_SESSION['ticket_user']->getPermission(); }else{ //default permission $return['permission'] = 0; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/DBScheme.png b/code/ryzom/tools/server/ryzom_ams/www/html/sql/DBScheme.png index 340e67c5c6f832c1b159f85c0535c1e6ab755a6f..16bced7cc392b28920028d92ef7b51c69bafc5b4 100644 GIT binary patch literal 124474 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 We}!?l-!tI2C4;A{pUXO@geCxT(r4BH literal 114396 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

    -hiS09>%#|~z28ktk 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%0Aj{7| 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 z6BLCNdxinhNsfexecuteWithoutParams($sql); //SETUP THE AMS_LIB DB - $dbl = new DBLayer($cfg['db']['lib']); + $dbl = new DBLayer("lib"); $sql = " CREATE DATABASE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`; USE `" . $cfg['db']['lib']['name'] ."`; @@ -42,208 +42,339 @@ CREATE TABLE ams_querycache ( `SID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `type` VARCHAR( 64 ) NOT NULL , - `query` VARCHAR( 512 ) NOT NULL + `query` VARCHAR( 512 ) NOT NULL, + `db` VARCHAR( 80 ) NOT NULL ); - -- ----------------------------------------------------- - -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_category` - -- ----------------------------------------------------- - DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_category` ; + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_category` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_category` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_category` ( + `TCategoryId` INT UNSIGNED NOT NULL AUTO_INCREMENT , + `Name` VARCHAR(45) NOT NULL , + PRIMARY KEY (`TCategoryId`) , + UNIQUE INDEX `Name_UNIQUE` (`Name` ASC) ) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_user` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_user` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_user` ( + `TUserId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT , + `Permission` INT(3) NOT NULL DEFAULT 1 , + `ExternId` INT(10) UNSIGNED NOT NULL , + PRIMARY KEY (`TUserId`) ) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket` ( + `TId` INT UNSIGNED NOT NULL AUTO_INCREMENT , + `Timestamp` TIMESTAMP NOT NULL , + `Title` VARCHAR(120) NOT NULL , + `Status` INT NULL DEFAULT 0 , + `Queue` INT NULL DEFAULT 0 , + `Ticket_Category` INT UNSIGNED NOT NULL , + `Author` INT UNSIGNED NOT NULL , + `Priority` INT(3) NULL DEFAULT 0 , + PRIMARY KEY (`TId`) , + INDEX `fk_ticket_ticket_category_idx` (`Ticket_Category` ASC) , + INDEX `fk_ticket_ams_user_idx` (`Author` ASC) , + CONSTRAINT `fk_ticket_ticket_category` + FOREIGN KEY (`Ticket_Category` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_category` (`TCategoryId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_ticket_ams_user` + FOREIGN KEY (`Author` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`assigned` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`assigned` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`assigned` ( + `Ticket` INT UNSIGNED NOT NULL , + `User` INT UNSIGNED NOT NULL , + INDEX `fk_assigned_ticket_idx` (`Ticket` ASC) , + PRIMARY KEY (`Ticket`, `User`) , + INDEX `fk_assigned_ams_user_idx` (`User` ASC) , + CONSTRAINT `fk_assigned_ticket` + FOREIGN KEY (`Ticket` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_assigned_ams_user` + FOREIGN KEY (`User` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`tag` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`tag` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`tag` ( + `TagId` INT UNSIGNED NOT NULL AUTO_INCREMENT , + `Value` VARCHAR(60) NOT NULL , + PRIMARY KEY (`TagId`) , + UNIQUE INDEX `Value_UNIQUE` (`Value` ASC) ) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`tagged` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`tagged` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`tagged` ( + `Ticket` INT UNSIGNED NOT NULL , + `Tag` INT UNSIGNED NOT NULL , + PRIMARY KEY (`Ticket`, `Tag`) , + INDEX `fk_tagged_tag_idx` (`Tag` ASC) , + CONSTRAINT `fk_tagged_ticket` + FOREIGN KEY (`Ticket` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_tagged_tag` + FOREIGN KEY (`Tag` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`tag` (`TagId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_content` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_content` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_content` ( + `TContentId` INT UNSIGNED NOT NULL AUTO_INCREMENT , + `Content` TEXT NULL , + PRIMARY KEY (`TContentId`) ) + ENGINE = InnoDB + DEFAULT CHARACTER SET = utf8; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_reply` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_reply` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_reply` ( + `TReplyId` INT UNSIGNED NOT NULL AUTO_INCREMENT , + `Ticket` INT UNSIGNED NOT NULL , + `Author` INT UNSIGNED NOT NULL , + `Content` INT UNSIGNED NOT NULL , + `Timestamp` TIMESTAMP NULL , + `Hidden` TINYINT(1) NULL DEFAULT 0 , + PRIMARY KEY (`TReplyId`) , + INDEX `fk_ticket_reply_ticket_idx` (`Ticket` ASC) , + INDEX `fk_ticket_reply_ams_user_idx` (`Author` ASC) , + INDEX `fk_ticket_reply_content_idx` (`Content` ASC) , + CONSTRAINT `fk_ticket_reply_ticket` + FOREIGN KEY (`Ticket` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_ticket_reply_ams_user` + FOREIGN KEY (`Author` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_ticket_reply_ticket_content` + FOREIGN KEY (`Content` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_content` (`TContentId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_group` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_group` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_group` ( + `TGroupId` INT UNSIGNED NOT NULL AUTO_INCREMENT , + `Title` VARCHAR(80) NOT NULL , + PRIMARY KEY (`TGroupId`) , + UNIQUE INDEX `Title_UNIQUE` (`Title` ASC) ) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`in_group` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`in_group` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`in_group` ( + `Ticket_Group` INT UNSIGNED NOT NULL , + `Ticket` INT UNSIGNED NOT NULL , + PRIMARY KEY (`Ticket_Group`, `Ticket`) , + INDEX `fk_in_group_ticket_group_idx` (`Ticket_Group` ASC) , + INDEX `fk_in_group_ticket_idx` (`Ticket` ASC) , + CONSTRAINT `fk_in_group_ticket_group` + FOREIGN KEY (`Ticket_Group` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_group` (`TGroupId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_in_group_ticket` + FOREIGN KEY (`Ticket` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_log` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_log` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_log` ( + `TLogId` INT UNSIGNED NOT NULL AUTO_INCREMENT , + `Timestamp` TIMESTAMP NOT NULL , + `Query` VARCHAR(255) NOT NULL , + `Ticket` INT UNSIGNED NOT NULL , + `Author` INT(10) UNSIGNED NULL , + PRIMARY KEY (`TLogId`) , + INDEX `fk_ticket_log_ticket1` (`Ticket` ASC) , + INDEX `fk_ticket_log_ticket_user1` (`Author` ASC) , + CONSTRAINT `fk_ticket_log_ticket1` + FOREIGN KEY (`Ticket` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_ticket_log_ticket_user1` + FOREIGN KEY (`Author` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; - CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_category` ( - `TCategoryId` INT NOT NULL AUTO_INCREMENT , - `Name` VARCHAR(45) NOT NULL , - PRIMARY KEY (`TCategoryId`) , - UNIQUE INDEX `Name_UNIQUE` (`Name` ASC) ) - ENGINE = InnoDB; - - INSERT IGNORE INTO `" . $cfg['db']['lib']['name'] ."`.`ticket_category` (`Name`) VALUES ('Hacking'),('Ingame-Bug'),('Website-Bug'),('Installation'); + INSERT IGNORE INTO `" . $cfg['db']['lib']['name'] ."`.`ticket_category` (`Name`) VALUES ('Hacking'),('Ingame-Bug'),('Website-Bug'),('Installation'); + + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`support_group` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`support_group` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`support_group` ( + `SGroupId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT , + `Name` VARCHAR(22) NOT NULL , + `Tag` VARCHAR(7) NOT NULL , + PRIMARY KEY (`SGroupId`) , + UNIQUE INDEX `Name_UNIQUE` (`Name` ASC) , + UNIQUE INDEX `Tag_UNIQUE` (`Tag` ASC) ) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`in_support_group` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`in_support_group` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`in_support_group` ( + `User` INT(10) UNSIGNED NOT NULL , + `Group` INT(10) UNSIGNED NOT NULL , + INDEX `fk_in_support_group_ticket_user1` (`User` ASC) , + INDEX `fk_in_support_group_support_group1` (`Group` ASC) , + CONSTRAINT `fk_in_support_group_ticket_user1` + FOREIGN KEY (`User` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_in_support_group_support_group1` + FOREIGN KEY (`Group` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`support_group` (`SGroupId` ) + ON DELETE CASCADE + ON UPDATE NO ACTION) + ENGINE = InnoDB; + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`forwarded` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`forwarded` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`forwarded` ( + `Group` INT(10) UNSIGNED NOT NULL , + `Ticket` INT UNSIGNED NOT NULL , + INDEX `fk_forwarded_support_group1` (`Group` ASC) , + INDEX `fk_forwarded_ticket1` (`Ticket` ASC) , + CONSTRAINT `fk_forwarded_support_group1` + FOREIGN KEY (`Group` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`support_group` (`SGroupId` ) + ON DELETE CASCADE + ON UPDATE NO ACTION, + CONSTRAINT `fk_forwarded_ticket1` + FOREIGN KEY (`Ticket` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + + + -- ----------------------------------------------------- + -- Table `" . $cfg['db']['lib']['name'] ."`.`email` + -- ----------------------------------------------------- + DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`email` ; + + CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`email` ( + `MailId` INT NOT NULL AUTO_INCREMENT , + `Recipient` VARCHAR(50) NULL , + `Subject` VARCHAR(60) NULL , + `Body` VARCHAR(400) NULL , + `Status` VARCHAR(45) NULL , + `Attempts` VARCHAR(45) NULL DEFAULT 0 , + `Sender` INT(10) UNSIGNED NOT NULL , + `UserId` INT(10) UNSIGNED NOT NULL , + `MessageId` VARCHAR(45) NOT NULL , + `TicketId` INT UNSIGNED NOT NULL , + PRIMARY KEY (`MailId`) , + INDEX `fk_email_ticket_user1` (`Sender` ASC) , + INDEX `fk_email_ticket_user2` (`UserId` ASC) , + INDEX `fk_email_ticket1` (`TicketId` ASC) , + CONSTRAINT `fk_email_ticket_user1` + FOREIGN KEY (`Sender` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_email_ticket_user2` + FOREIGN KEY (`UserId` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_email_ticket1` + FOREIGN KEY (`TicketId` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + - -- ----------------------------------------------------- - -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_user` - -- ----------------------------------------------------- - DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_user` ; - - CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_user` ( - `TUserId` INT(10) NOT NULL AUTO_INCREMENT , - `Permission` INT(3) NOT NULL DEFAULT 1 , - `ExternId` INT(10) NOT NULL , - PRIMARY KEY (`TUserId`) ) - ENGINE = InnoDB; - - - -- ----------------------------------------------------- - -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket` - -- ----------------------------------------------------- - DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket` ; - - CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket` ( - `TId` INT NOT NULL AUTO_INCREMENT , - `Timestamp` TIMESTAMP NOT NULL , - `Title` VARCHAR(120) NOT NULL , - `Status` INT NULL DEFAULT 0 , - `Queue` INT NULL DEFAULT 0 , - `Ticket_Category` INT NOT NULL , - `Author` INT NOT NULL , - PRIMARY KEY (`TId`) , - INDEX `fk_ticket_ticket_category_idx` (`Ticket_Category` ASC) , - INDEX `fk_ticket_ams_user_idx` (`Author` ASC) , - CONSTRAINT `fk_ticket_ticket_category` - FOREIGN KEY (`Ticket_Category` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_category` (`TCategoryId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_ticket_ams_user` - FOREIGN KEY (`Author` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - - - -- ----------------------------------------------------- - -- Table `" . $cfg['db']['lib']['name'] ."`.`assigned` - -- ----------------------------------------------------- - DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`assigned` ; - - CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`assigned` ( - `Ticket` INT NOT NULL , - `User` INT NOT NULL , - INDEX `fk_assigned_ticket_idx` (`Ticket` ASC) , - PRIMARY KEY (`Ticket`, `User`) , - INDEX `fk_assigned_ams_user_idx` (`User` ASC) , - CONSTRAINT `fk_assigned_ticket` - FOREIGN KEY (`Ticket` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_assigned_ams_user` - FOREIGN KEY (`User` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - - - -- ----------------------------------------------------- - -- Table `" . $cfg['db']['lib']['name'] ."`.`tag` - -- ----------------------------------------------------- - DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`tag` ; - - CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`tag` ( - `TagId` INT NOT NULL AUTO_INCREMENT , - `Value` VARCHAR(60) NOT NULL , - PRIMARY KEY (`TagId`) , - UNIQUE INDEX `Value_UNIQUE` (`Value` ASC) ) - ENGINE = InnoDB; - - - -- ----------------------------------------------------- - -- Table `" . $cfg['db']['lib']['name'] ."`.`tagged` - -- ----------------------------------------------------- - DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`tagged` ; - - CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`tagged` ( - `Ticket` INT NOT NULL , - `Tag` INT NOT NULL , - PRIMARY KEY (`Ticket`, `Tag`) , - INDEX `fk_tagged_tag_idx` (`Tag` ASC) , - CONSTRAINT `fk_tagged_ticket` - FOREIGN KEY (`Ticket` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_tagged_tag` - FOREIGN KEY (`Tag` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`tag` (`TagId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - - - -- ----------------------------------------------------- - -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_content` - -- ----------------------------------------------------- - DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_content` ; - - CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_content` ( - `TContentId` INT NOT NULL AUTO_INCREMENT , - `Content` TEXT NULL , - PRIMARY KEY (`TContentId`) ) - ENGINE = InnoDB - DEFAULT CHARACTER SET = utf8; - - - -- ----------------------------------------------------- - -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_reply` - -- ----------------------------------------------------- - DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_reply` ; - - CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_reply` ( - `TReplyId` INT NOT NULL AUTO_INCREMENT , - `Ticket` INT NOT NULL , - `Author` INT NOT NULL , - `Content` INT NOT NULL , - `Timestamp` TIMESTAMP NULL , - PRIMARY KEY (`TReplyId`) , - INDEX `fk_ticket_reply_ticket_idx` (`Ticket` ASC) , - INDEX `fk_ticket_reply_ams_user_idx` (`Author` ASC) , - INDEX `fk_ticket_reply_content_idx` (`Content` ASC) , - CONSTRAINT `fk_ticket_reply_ticket` - FOREIGN KEY (`Ticket` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_ticket_reply_ams_user` - FOREIGN KEY (`Author` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_ticket_reply_ticket_content` - FOREIGN KEY (`Content` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_content` (`TContentId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - - - -- ----------------------------------------------------- - -- Table `" . $cfg['db']['lib']['name'] ."`.`ticket_group` - -- ----------------------------------------------------- - DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_group` ; - - CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`ticket_group` ( - `TGroupId` INT NOT NULL AUTO_INCREMENT , - `Title` VARCHAR(80) NOT NULL , - PRIMARY KEY (`TGroupId`) , - UNIQUE INDEX `Title_UNIQUE` (`Title` ASC) ) - ENGINE = InnoDB; - - - -- ----------------------------------------------------- - -- Table `" . $cfg['db']['lib']['name'] ."`.`in_group` - -- ----------------------------------------------------- - DROP TABLE IF EXISTS `" . $cfg['db']['lib']['name'] ."`.`in_group` ; - - CREATE TABLE IF NOT EXISTS `" . $cfg['db']['lib']['name'] ."`.`in_group` ( - `Ticket_Group` INT NOT NULL , - `Ticket` INT NOT NULL , - PRIMARY KEY (`Ticket_Group`, `Ticket`) , - INDEX `fk_in_group_ticket_group_idx` (`Ticket_Group` ASC) , - INDEX `fk_in_group_ticket_idx` (`Ticket` ASC) , - CONSTRAINT `fk_in_group_ticket_group` - FOREIGN KEY (`Ticket_Group` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_group` (`TGroupId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_in_group_ticket` - FOREIGN KEY (`Ticket` ) - REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - - "; $dbl->executeWithoutParams($sql); @@ -255,12 +386,14 @@ 'name' => "admin", 'pass' => $hashpass, 'mail' => "admin@admin.com", + 'permission' => 3 ); - Users::createUser($params, 1); try{ - $params['permission'] = 2; - $dbw = new DBLayer($cfg['db']['web']); - $dbw->execute("INSERT INTO ams_user (Login, Password, Email, Permission) VALUES (:name, :pass, :mail, :permission)",$params); + $dbw = new DBLayer("web"); + $user_id = $dbw->executeReturnId("INSERT INTO ams_user (Login, Password, Email, Permission) VALUES (:name, :pass, :mail, :permission)",$params); + Users::createUser($params, $user_id); + $dbl = new DBLayer("lib"); + $dbl->execute("UPDATE ticket_user SET Permission = 3 WHERE TUserId = :user_id",array('user_id' => $user_id)); print "The admin account is created, you can login with id: admin, pass: admin!"; }catch (PDOException $e){ print "There was an error while creating the admin account! "; @@ -277,4 +410,4 @@ print_r($e); } - \ No newline at end of file + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql index 0f22a9741..e7864e628 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql +++ b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql @@ -11,7 +11,7 @@ USE `mydb` ; DROP TABLE IF EXISTS `mydb`.`ticket_category` ; CREATE TABLE IF NOT EXISTS `mydb`.`ticket_category` ( - `TCategoryId` INT NOT NULL AUTO_INCREMENT , + `TCategoryId` INT UNSIGNED NOT NULL AUTO_INCREMENT , `Name` VARCHAR(45) NOT NULL , PRIMARY KEY (`TCategoryId`) , UNIQUE INDEX `Name_UNIQUE` (`Name` ASC) ) @@ -24,9 +24,9 @@ ENGINE = InnoDB; DROP TABLE IF EXISTS `mydb`.`ticket_user` ; CREATE TABLE IF NOT EXISTS `mydb`.`ticket_user` ( - `TUserId` INT(10) NOT NULL AUTO_INCREMENT , + `TUserId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT , `Permission` INT(3) NOT NULL DEFAULT 1 , - `ExternId` INT(10) NOT NULL , + `ExternId` INT(10) UNSIGNED NOT NULL , PRIMARY KEY (`TUserId`) ) ENGINE = InnoDB; @@ -37,13 +37,14 @@ ENGINE = InnoDB; DROP TABLE IF EXISTS `mydb`.`ticket` ; CREATE TABLE IF NOT EXISTS `mydb`.`ticket` ( - `TId` INT NOT NULL AUTO_INCREMENT , + `TId` INT UNSIGNED NOT NULL AUTO_INCREMENT , `Timestamp` TIMESTAMP NOT NULL , `Title` VARCHAR(120) NOT NULL , `Status` INT NULL DEFAULT 0 , `Queue` INT NULL DEFAULT 0 , - `Ticket_Category` INT NOT NULL , - `Author` INT NOT NULL , + `Ticket_Category` INT UNSIGNED NOT NULL , + `Author` INT UNSIGNED NOT NULL , + `Priority` INT(3) NULL DEFAULT 0 , PRIMARY KEY (`TId`) , INDEX `fk_ticket_ticket_category_idx` (`Ticket_Category` ASC) , INDEX `fk_ticket_ams_user_idx` (`Author` ASC) , @@ -66,8 +67,8 @@ ENGINE = InnoDB; DROP TABLE IF EXISTS `mydb`.`assigned` ; CREATE TABLE IF NOT EXISTS `mydb`.`assigned` ( - `Ticket` INT NOT NULL , - `User` INT NOT NULL , + `Ticket` INT UNSIGNED NOT NULL , + `User` INT UNSIGNED NOT NULL , INDEX `fk_assigned_ticket_idx` (`Ticket` ASC) , PRIMARY KEY (`Ticket`, `User`) , INDEX `fk_assigned_ams_user_idx` (`User` ASC) , @@ -90,7 +91,7 @@ ENGINE = InnoDB; DROP TABLE IF EXISTS `mydb`.`tag` ; CREATE TABLE IF NOT EXISTS `mydb`.`tag` ( - `TagId` INT NOT NULL AUTO_INCREMENT , + `TagId` INT UNSIGNED NOT NULL AUTO_INCREMENT , `Value` VARCHAR(60) NOT NULL , PRIMARY KEY (`TagId`) , UNIQUE INDEX `Value_UNIQUE` (`Value` ASC) ) @@ -103,8 +104,8 @@ ENGINE = InnoDB; DROP TABLE IF EXISTS `mydb`.`tagged` ; CREATE TABLE IF NOT EXISTS `mydb`.`tagged` ( - `Ticket` INT NOT NULL , - `Tag` INT NOT NULL , + `Ticket` INT UNSIGNED NOT NULL , + `Tag` INT UNSIGNED NOT NULL , PRIMARY KEY (`Ticket`, `Tag`) , INDEX `fk_tagged_tag_idx` (`Tag` ASC) , CONSTRAINT `fk_tagged_ticket` @@ -126,7 +127,7 @@ ENGINE = InnoDB; DROP TABLE IF EXISTS `mydb`.`ticket_content` ; CREATE TABLE IF NOT EXISTS `mydb`.`ticket_content` ( - `TContentId` INT NOT NULL AUTO_INCREMENT , + `TContentId` INT UNSIGNED NOT NULL AUTO_INCREMENT , `Content` TEXT NULL , PRIMARY KEY (`TContentId`) ) ENGINE = InnoDB @@ -139,11 +140,12 @@ DEFAULT CHARACTER SET = utf8; DROP TABLE IF EXISTS `mydb`.`ticket_reply` ; CREATE TABLE IF NOT EXISTS `mydb`.`ticket_reply` ( - `TReplyId` INT NOT NULL AUTO_INCREMENT , - `Ticket` INT NOT NULL , - `Author` INT NOT NULL , - `Content` INT NOT NULL , + `TReplyId` INT UNSIGNED NOT NULL AUTO_INCREMENT , + `Ticket` INT UNSIGNED NOT NULL , + `Author` INT UNSIGNED NOT NULL , + `Content` INT UNSIGNED NOT NULL , `Timestamp` TIMESTAMP NULL , + `Hidden` TINYINT(1) NULL DEFAULT 0 , PRIMARY KEY (`TReplyId`) , INDEX `fk_ticket_reply_ticket_idx` (`Ticket` ASC) , INDEX `fk_ticket_reply_ams_user_idx` (`Author` ASC) , @@ -172,7 +174,7 @@ ENGINE = InnoDB; DROP TABLE IF EXISTS `mydb`.`ticket_group` ; CREATE TABLE IF NOT EXISTS `mydb`.`ticket_group` ( - `TGroupId` INT NOT NULL AUTO_INCREMENT , + `TGroupId` INT UNSIGNED NOT NULL AUTO_INCREMENT , `Title` VARCHAR(80) NOT NULL , PRIMARY KEY (`TGroupId`) , UNIQUE INDEX `Title_UNIQUE` (`Title` ASC) ) @@ -185,8 +187,8 @@ ENGINE = InnoDB; DROP TABLE IF EXISTS `mydb`.`in_group` ; CREATE TABLE IF NOT EXISTS `mydb`.`in_group` ( - `Ticket_Group` INT NOT NULL , - `Ticket` INT NOT NULL , + `Ticket_Group` INT UNSIGNED NOT NULL , + `Ticket` INT UNSIGNED NOT NULL , PRIMARY KEY (`Ticket_Group`, `Ticket`) , INDEX `fk_in_group_ticket_group_idx` (`Ticket_Group` ASC) , INDEX `fk_in_group_ticket_idx` (`Ticket` ASC) , @@ -203,6 +205,132 @@ CREATE TABLE IF NOT EXISTS `mydb`.`in_group` ( ENGINE = InnoDB; +-- ----------------------------------------------------- +-- Table `mydb`.`ticket_log` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`ticket_log` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`ticket_log` ( + `TLogId` INT UNSIGNED NOT NULL AUTO_INCREMENT , + `Timestamp` TIMESTAMP NOT NULL , + `Query` VARCHAR(255) NOT NULL , + `Ticket` INT UNSIGNED NOT NULL , + `Author` INT(10) UNSIGNED NULL , + PRIMARY KEY (`TLogId`) , + INDEX `fk_ticket_log_ticket1` (`Ticket` ASC) , + INDEX `fk_ticket_log_ticket_user1` (`Author` ASC) , + CONSTRAINT `fk_ticket_log_ticket1` + FOREIGN KEY (`Ticket` ) + REFERENCES `mydb`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_ticket_log_ticket_user1` + FOREIGN KEY (`Author` ) + REFERENCES `mydb`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`support_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`support_group` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`support_group` ( + `SGroupId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT , + `Name` VARCHAR(22) NOT NULL , + `Tag` VARCHAR(7) NOT NULL , + PRIMARY KEY (`SGroupId`) , + UNIQUE INDEX `Name_UNIQUE` (`Name` ASC) , + UNIQUE INDEX `Tag_UNIQUE` (`Tag` ASC) ) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`in_support_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`in_support_group` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`in_support_group` ( + `User` INT(10) UNSIGNED NOT NULL , + `Group` INT(10) UNSIGNED NOT NULL , + INDEX `fk_in_support_group_ticket_user1` (`User` ASC) , + INDEX `fk_in_support_group_support_group1` (`Group` ASC) , + CONSTRAINT `fk_in_support_group_ticket_user1` + FOREIGN KEY (`User` ) + REFERENCES `mydb`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_in_support_group_support_group1` + FOREIGN KEY (`Group` ) + REFERENCES `mydb`.`support_group` (`SGroupId` ) + ON DELETE CASCADE + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`forwarded` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`forwarded` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`forwarded` ( + `Group` INT(10) UNSIGNED NOT NULL , + `Ticket` INT UNSIGNED NOT NULL , + INDEX `fk_forwarded_support_group1` (`Group` ASC) , + INDEX `fk_forwarded_ticket1` (`Ticket` ASC) , + CONSTRAINT `fk_forwarded_support_group1` + FOREIGN KEY (`Group` ) + REFERENCES `mydb`.`support_group` (`SGroupId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_forwarded_ticket1` + FOREIGN KEY (`Ticket` ) + REFERENCES `mydb`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`email` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`email` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`email` ( + `MailId` INT NOT NULL AUTO_INCREMENT , + `Recipient` VARCHAR(50) NULL , + `Subject` VARCHAR(60) NULL , + `Body` VARCHAR(400) NULL , + `Status` VARCHAR(45) NULL , + `Attempts` VARCHAR(45) NULL DEFAULT 0 , + `Sender` INT(10) UNSIGNED NOT NULL , + `UserId` INT(10) UNSIGNED NOT NULL , + `MessageId` VARCHAR(45) NOT NULL , + `TicketId` INT UNSIGNED NOT NULL , + PRIMARY KEY (`MailId`) , + INDEX `fk_email_ticket_user1` (`Sender` ASC) , + INDEX `fk_email_ticket_user2` (`UserId` ASC) , + INDEX `fk_email_ticket1` (`TicketId` ASC) , + CONSTRAINT `fk_email_ticket_user1` + FOREIGN KEY (`Sender` ) + REFERENCES `mydb`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_email_ticket_user2` + FOREIGN KEY (`UserId` ) + REFERENCES `mydb`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_email_ticket1` + FOREIGN KEY (`TicketId` ) + REFERENCES `mydb`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb index 53f58f0371074bb0e1fc828a87e13229d3ac9720..baf11d3359d5b56ab84791b5294de39ccc4c5434 100644 GIT binary patch literal 16833 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 literal 12381 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 diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/table.php b/code/ryzom/tools/server/ryzom_ams/www/html/table.php index d0eb7d815..0a023296c 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/table.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/table.php @@ -210,6 +210,710 @@ +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/createticket.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/createticket.tpl index 0b2ad2813..bd0564932 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/createticket.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/createticket.tpl @@ -37,7 +37,7 @@
    - +
    diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout.tpl index 32088c7b8..f8fb5078c 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout.tpl @@ -67,7 +67,7 @@ - Ryzom Core Logo + Ryzom Core Logo
    diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_admin.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_admin.tpl index cd7bc60ad..c50c1c20d 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_admin.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_admin.tpl @@ -5,10 +5,11 @@
  • Profile
  • Settings
  • -
  • Liblist
  • -
  • UserList
  • +
  • Users
  • +
  • Queues
  • +
  • Support Groups
  • +
  • Syncing
  • Logout
  • - {/block} diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_mod.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_mod.tpl new file mode 100644 index 000000000..e0a77d99a --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_mod.tpl @@ -0,0 +1,14 @@ +{extends file="layout.tpl"} +{block name=menu} + +
  • Dashboard
  • +
  • Profile
  • +
  • Settings
  • + +
  • Users
  • +
  • Queues
  • +
  • Support Groups
  • + +
  • Logout
  • +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/register.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/register.tpl index c97323520..bcf4de48b 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/register.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/register.tpl @@ -105,7 +105,7 @@
    {/if} - +
    @@ -115,7 +115,7 @@ - +
    diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/settings.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/settings.tpl index f9ad610d9..0a7aa263c 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/settings.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/settings.tpl @@ -13,7 +13,7 @@
    Change Password - {if !isset($isAdmin) or $isAdmin eq "FALSE"} + {if !isset($changesOther) or $changesOther eq "FALSE"}
    diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/sgroup_list.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/sgroup_list.tpl new file mode 100644 index 000000000..57ab6e01f --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/sgroup_list.tpl @@ -0,0 +1,108 @@ +{block name=content} + + +
    +
    +
    +

    List

    +
    + + +
    +
    +
    +
    + All support groups +
    + + +
    +
    + + + +
    + + + {if isset($ACTION_RESULT)} + +
    + + + +
    +

    Tickets

    +

    +

    + + + + + + + + + + + + + + + + +
    Show + + tickets + + to + + : + + or + + + + +
    +
    +

    +

    + + + + + + + + + + + + {foreach from=$tickets item=ticket} + + + + + + + + + + + {/foreach} +
    IDTitleAssignedTimestampCategoryStatusSupportGroupActions
    {$ticket.tId}{$ticket.title}{if $ticket.assignedText neq ""} {$ticket.assignedText}{else} {$not_assigned} {/if}{$ticket.timestamp}{$ticket.category}{if $ticket.status eq 0}{else if $ticket.status eq 1}{else if $ticket.status eq 2}{/if}{$ticket.statusText} + + {if $ticket.forwardedGroupName eq "0"} + {$public_sgroup} + {else} + {$ticket.forwardedGroupName} + {/if} + + + {if $ticket.assigned eq 0} +
    + + + +
    + {else if $ticket.assigned eq $user_id} +
    + + + +
    + {/if} +
    +

    +
    + + + + {foreach from=$links item=link} + + {/foreach} + + +
    «{$link}»
    +
    +
    + + + + + + +
    + {if isset($ACTION_RESULT) and $ACTION_RESULT eq "SUCCESS_ASSIGNED"} +

    + {$success_assigned} +

    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "SUCCESS_UNASSIGNED"} +

    + {$success_unassigned} +

    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "TICKET_NOT_EXISTING"} +

    + {$ticket_not_existing} +

    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "ALREADY_ASSIGNED"} +

    + {$ticket_already_assigned} +

    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "NOT_ASSIGNED"} +

    + {$ticket_not_assigned} +

    + {/if} +
    + + {/if} +
    +
    +
    + +
    + + + + + + + +
    + + + + +
    + + + + + +
    Show TicketShow Ticket Log
    +
    +
    +
    + + + + + + + + + +

    Reply ID#{$reply_id} of Ticket #{$ticket_id}

    +
    + + + + + + + + + + +
    + + +
    +
    + + +
    + + +
    + + +
    +

    Reply:

    +

    + + + + +
    +

    + {$reply_timestamp} + {if $author_permission eq '1'} + {if isset($isMod) and $isMod eq "TRUE"} {$authorName}{else} {$authorName} {/if} + {else if $reply.permission gt '1'} + {if isset($isMod) and $isMod eq "TRUE"} {$authorName}{else} {$authorName} {/if} + {/if}

    +

    {$reply_content}

    +
    +

    +
    +
    +
    +
    + +
    + + + + + + + + + +

    Support Group: {$groupsname}

    +
    + + + + + + + + + + +
    + + +
    +
    + + + +
    + + +
    + + +
    +

    Add user to the list

    + {if isset($isAdmin) && $isAdmin eq 'TRUE'} +
    + + + + + +
    Username:
    + + + +

    + +

    + + {if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "SUCCESS"} +

    + {$add_to_group_success} +

    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "ALREADY_ADDED"} +

    + {$user_already_added} +

    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "GROUP_NOT_EXISTING"} +

    + {$group_not_existing} +

    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "USER_NOT_EXISTING"} +

    + {$user_not_existing} +

    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "NOT_MOD_OR_ADMIN"} +

    + {$not_mod_or_admin} +

    + {/if} +
    + {/if} +
    +
    +
    + + +
    + + +
    +

    All members

    + + + + + {if isset($isAdmin) && $isAdmin eq 'TRUE'}{/if} + + + {foreach from=$userlist item=user} + + + + {if isset($isAdmin) && $isAdmin eq 'TRUE'}{/if} + + {/foreach} +
    IDNameAction
    {$user.tUserId}{$user.name}Delete
    +
    +
    +
    +
    + +
    + + + + + + + +
    + + + + +
    + + + {if isset($isMod) and $isMod eq "TRUE"}{/if} + + +
    Show Ticket LogSend Other Ticket
    +
    +
    +
    + + + + + + + + + +

    [{$t_title}-#{$ticket_tId}] {$ticket_title}

    +
    + + + + + + + + + + +
    + + +
    +
    + + +
    + + +
    + + +
    + + + + + {if isset($isMod) and $isMod eq "TRUE"} + +
    + + +
    + + + + + + + + + + + + + + + + +
    Submitted: {$ticket_timestamp}Last Updated: {$ticket_lastupdate}Status: {if $ticket_status neq 3}Open{/if} {if $ticket_status eq 3} {$ticket_statustext}{else}{$ticket_statustext} {/if}
    Category: {$ticket_category}Priority {$ticket_prioritytext}Support Group: + + {if $ticket_forwardedGroupName eq "0"} + {$public_sgroup} + {else} + {$ticket_forwardedGroupName} + {/if} + +
    Assigned To: {if $ticket_assignedTo neq ""} {$ticket_assignedToText}{else} {$not_assigned} {/if}
    +
    +
    + + {foreach from=$ticket_replies item=reply} + + + + {/foreach} + + {if $ticket_status eq 3} + + + + {/if} + + + + +
    + + +
    +

    + {$reply.timestamp} + {if $reply.permission eq '1'} + {if isset($isMod) and $isMod eq "TRUE"} {$reply.author}{else} {$reply.author} {/if} + {else if $reply.permission gt '1'} + {if isset($isMod) and $isMod eq "TRUE"} {$reply.author}{else} {$reply.author} {/if} + {/if} +

    +

    {$reply.replyContent}

    +
    +
    + + +
    +

    [Ticket is closed]

    +
    +
    + +
    + + + + + + {if $ticket_status neq 3} + + + + {if isset($isMod) and $isMod eq "TRUE"} + + + + {/if} + {/if} + + + + + + +
    +

    {$t_reply}:

    +
    Hide reply for user.
    + {if isset($isMod) and $isMod eq "TRUE"} + + + + + +
    + Change status to + + + Change priority to + +
    + {/if} +
    + + + +
    +
    +
    +
    + + +
    + + + + + +
    +

    + Ticket Assigning: + {if $ticket_assignedTo eq 0} +

    + + + +
    + {else if $ticket_assignedTo eq $user_id} +
    + + + +
    + {/if} +

    + {if isset($ACTION_RESULT) and $ACTION_RESULT eq "SUCCESS_ASSIGNED"} +

    + {$success_assigned} +

    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "SUCCESS_UNASSIGNED"} +

    + {$success_unassigned} +

    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "TICKET_NOT_EXISTING"} +

    + {$ticket_not_existing} +

    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "ALREADY_ASSIGNED"} +

    + {$ticket_already_assigned} +

    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "NOT_ASSIGNED"} +

    + {$ticket_not_assigned} +

    + {/if} + + +
    +

    + Forward to Group: +

    + + + + + +
    +

    + {if isset($ACTION_RESULT) and $ACTION_RESULT eq "INVALID_SGROUP"} +

    + {$invalid_sgroup} +

    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "TICKET_NOT_EXISTING"} +

    + {$ticket_not_existing} +

    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "SUCCESS_FORWARDED"} +

    + {$success_forwarded} +

    + {/if} +
    +
    +
    + {/if} + +
    +
    +
    +
    +
    + +
    + + + + + + + +
    + + + + +
    + + + + +
    Show Ticket
    +
    +
    +
    + + + + + + + + + +

    Log of Ticket #{$ticket_id}

    +
    + + + + + + + + + + +
    + + +
    +
    + + +
    + + +
    + + +
    +

    Title: {$ticket_title}

    +

    + + + + + + + + {foreach from=$ticket_logs item=log} + + + + + + {/foreach} + +
    IDTimestampQuery
    {$log.tLogId}{$log.timestamp}{$log.query}
    +

    +
    +
    +
    +
    + +
    + + + + + + + +
    + + + + +
    + + + + + {if isset($isAdmin) and $isAdmin eq 'TRUE' and $target_id neq 1} + {if $userPermission eq 1} + + + {else if $userPermission eq 2 } + + + {else if $userPermission eq 3 } + + + {/if} + {/if} + +
    Edit UserSend TicketMake ModeratorMake AdminDemote to UserMake AdminDemote to UserDemote to Moderator
    +
    +
    +
    + + + + + + + + + +

    Profile of {$target_name}

    +
    + + + + + + + + + + +
    + + +
    +
    + + + +
    + + +
    + + +
    + +

    Info

    + + + + + + + + + + + + {if $firstName neq ""} + + + + + {/if} + {if $lastName neq ""} + + + + + {/if} + {if $country neq ""} + + + + + {/if} + {if $gender neq 0} + + + {if $gender eq 1} + + {else if $gender eq 2} + + {/if} + + {/if} + +
    Email:{$mail}
    Role: + {if $userPermission eq 1}User{/if} + {if $userPermission eq 2}Moderator{/if} + {if $userPermission eq 3}Admin{/if} +
    Firstname:{$firstName}
    LastName:{$lastName}
    Country:{$country}
    Gender:♂♀
    +
    +
    +
    + + +
    + + +
    +

    Tickets

    + + + + + + + + + + + {foreach from=$ticketlist item=ticket} + + + + + + + + + {/foreach} + +
    IDTitleTimestampCategoryStatus
    {$ticket.tId}{$ticket.title}{$ticket.timestamp}{$ticket.category}{if $ticket.status eq 0} {/if} {$ticket.statusText}
    +
    +
    +
    +
    + +
    + + + + + + + + + +

    Members

    +
    + + + + + + + + + + +
    + + +
    +
    + + +
    + + +
    + + + +
    +

    All Acounts

    + + + + + + + + + + {foreach from=$userlist item=element} + + + + + {if $element.permission eq 1}{/if} + {if $element.permission eq 2}{/if} + {if $element.permission eq 3}{/if} + + + + {/foreach} +
    IdUsernameEmailPermissionAction
    {$element.id}{$element.username}{$element.email}UserModeratorAdmin + Show User + Edit User + {if isset($isAdmin) and $isAdmin eq 'TRUE' and $element.id neq 1} + {if $element.permission eq 1} + Make Moderator + Make Admin + {else if $element.permission eq 2 } + Demote to User + Make Admin + {else if $element.permission eq 3 } + Demote to User + Demote to Moderator + {/if} + {/if} +
    +
    + + + + {foreach from=$links item=link} + + {/foreach} + + +
    «{$link}»
    +
    +
    +
    +
    + +
    David R2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Chris Jack2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Jack Chris2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Muhammad Usman2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Sheikh Heera2012/02/01Staff + Banned + + + + View + + + + Edit + + + + Delete + +
    Helen Garner2012/02/01Staff + Banned + + + + View + + + + Edit + + + + Delete + +
    Saruar Ahmed2012/03/01Member + Pending + + + + View + + + + Edit + + + + Delete + +
    Ahemd Saruar2012/03/01Member + Pending + + + + View + + + + Edit + + + + Delete + +
    David R2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Chris Jack2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Jack Chris2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Muhammad Usman2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Sheikh Heera2012/02/01Staff + Banned + + + + View + + + + Edit + + + + Delete + +
    Helen Garner2012/02/01Staff + Banned + + + + View + + + + Edit + + + + Delete + +
    Saruar Ahmed2012/03/01Member + Pending + + + + View + + + + Edit + + + + Delete + +
    Ahemd Saruar2012/03/01Member + Pending + + + + View + + + + Edit + + + + Delete + +
    David R2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Chris Jack2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Jack Chris2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Muhammad Usman2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Sheikh Heera2012/02/01Staff + Banned + + + + View + + + + Edit + + + + Delete + +
    Helen Garner2012/02/01Staff + Banned + + + + View + + + + Edit + + + + Delete + +
    Saruar Ahmed2012/03/01Member + Pending + + + + View + + + + Edit + + + + Delete + +
    Ahemd Saruar2012/03/01Member + Pending + + + + View + + + + Edit + + + + Delete + +
    David R2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Chris Jack2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Jack Chris2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Muhammad Usman2012/01/01Member + Active + + + + View + + + + Edit + + + + Delete + +
    Sheikh Heera2012/02/01Staff + Banned + + + + View + + + + Edit + + + + Delete + +
    Helen Garner2012/02/01Staff + Banned + + + + View + + + + Edit + + + + Delete + +
    Saruar Ahmed2012/03/01Member + Pending + + + + View + + + + Edit + + + + Delete + +
    Ahemd Saruar2012/03/01Member + Pending + + + + View + + + + Edit + + + + Delete + +
    Habib Rizwan 2012/01/21
    + + + + + + {if isset($isAdmin) && $isAdmin eq 'TRUE'}{/if} + + + + {foreach from=$grouplist item=group} + + + + + {if isset($isAdmin) && $isAdmin eq 'TRUE'}{/if} + + {/foreach} + + +
    IDNameTagAction
    {$group.sGroupId}{$group.name}{$group.tag} Delete
    + + + + {if isset($isAdmin) && $isAdmin eq 'TRUE'} +
    +
    +

    Add

    +
    + + +
    +
    +
    +
    + + + + Add a support group + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    + + + +
    + +
    + +
    +
    + + {if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "SUCCESS"} +
    + {$group_success} +
    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "NAME_TAKEN"} +
    + {$group_name_taken} +
    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "TAG_TAKEN"} +
    + {$group_tag_taken} +
    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "SIZE_ERROR"} +
    + {$group_size_error} +
    + {/if} + + +
    +
    +
    + {/if} + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_queue.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_queue.tpl new file mode 100644 index 000000000..179767589 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_queue.tpl @@ -0,0 +1,197 @@ +{block name=content} +
    +
    +
    +

    Ticket Queue {$queue_view}

    +
    + + +
    +
    +
    +
    + Tickets + +
    +
    + Show + + tickets + + to + + + + + + + + + +
    + + +
    + + + {if isset($ACTION_RESULT) and $ACTION_RESULT eq "SUCCESS_ASSIGNED"} +
    + {$success_assigned} +
    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "SUCCESS_UNASSIGNED"} +
    + {$success_unassigned} +
    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "TICKET_NOT_EXISTING"} +
    + {$ticket_not_existing} +
    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "ALREADY_ASSIGNED"} +
    + {$ticket_already_assigned} +
    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "NOT_ASSIGNED"} +
    + {$ticket_not_assigned} +
    + {/if} + + + + + + + + + + + + + + + + {foreach from=$tickets item=ticket} + + + + + + + + + + + {/foreach} + + +
    IDTitleAssignedTimestampCategoryStatusSupportGroupActions
    {$ticket.tId}{$ticket.title}{if $ticket.assignedText neq ""} {$ticket.assignedText} {else} {$not_assigned} {/if}{$ticket.timestamp}{$ticket.category}{if $ticket.status eq 0} {/if} {$ticket.statusText} + + {if $ticket.forwardedGroupName eq "0"} + {$public_sgroup} + {else} + {$ticket.forwardedGroupName} + {/if} + + + {if $ticket.assigned eq 0} +
    + + + +
    + {else if $ticket.assigned eq $user_id} +
    + + + +
    + {/if} +
    + +
    +
      +
    • «
    • + {foreach from=$links item=link} +
    • {$link}
    • + {/foreach} +
    • »
    • +
    +
    +
    +
    +
    + +
    +
    +

    Actions

    +
    + + +
    +
    + +
    +
    + + + + + + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_reply.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_reply.tpl new file mode 100644 index 000000000..65f3f679b --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_reply.tpl @@ -0,0 +1,33 @@ +{block name=content} +
    +
    +
    +

    Show Reply

    +
    + + +
    +
    +
    +
    + Reply ID#{$reply_id} of Ticket #{$ticket_id} + + + + +
    +

    {$reply_timestamp} + {if $author_permission eq '1'} + {if isset($isMod) and $isMod eq "TRUE"} {$authorName}{else} {$authorName} {/if}

    + {else if $author_permission gt '1'} + {if isset($isMod) and $isMod eq "TRUE"} {$authorName}{else} {$authorName} {/if}

    + {/if} +

    {if $hidden eq 1}{/if}{$reply_content}{if $hidden eq 1}{/if}

    + +
    +
    +
    +
    +
    +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_sgroup.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_sgroup.tpl new file mode 100644 index 000000000..15c1d7b80 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_sgroup.tpl @@ -0,0 +1,103 @@ +{block name=content} +
    +
    +
    +

    {$groupsname} List

    +
    + + +
    +
    +
    +
    + All members of the {$groupsname} Support Group + + + + + + {if isset($isAdmin) && $isAdmin eq 'TRUE'}{/if} + + + + + {foreach from=$userlist item=user} + + + + {if isset($isAdmin) && $isAdmin eq 'TRUE'}{/if} + + {/foreach} + + +
    IDNameAction
    {$user.tUserId}{$user.name} Delete
    +
    +
    +
    + + {if isset($isAdmin) && $isAdmin eq 'TRUE'} +
    +
    +

    Add User

    +
    + + +
    +
    +
    +
    + +
    + + Add a user to the group '{$groupsname}' + +
    + +
    +
    + +
    +
    +
    + + + + +
    + +
    + +
    +
    + + {if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "SUCCESS"} +
    + {$add_to_group_success} +
    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "ALREADY_ADDED"} +
    + {$user_already_added} +
    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "GROUP_NOT_EXISTING"} +
    + {$group_not_existing} +
    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "USER_NOT_EXISTING"} +
    + {$user_not_existing} +
    + {else if isset($RESULT_OF_ADDING) and $RESULT_OF_ADDING eq "NOT_MOD_OR_ADMIN"} +
    + {$not_mod_or_admin} +
    + {/if} +
    + +
    +
    +
    + {/if} +
    + +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_ticket.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_ticket.tpl new file mode 100644 index 000000000..aae1bf9f9 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_ticket.tpl @@ -0,0 +1,235 @@ +{block name=content} +
    +
    +
    +

    {$t_title} #{$ticket_tId}

    +
    + + +
    +
    +
    +
    + {$title}: {$ticket_title} + + +
    + + + + + + + + + + + + + + + + +
    Original Submitted: {$ticket_timestamp}Last Updated: {$ticket_lastupdate}Status: {if $ticket_status neq 3}Open{/if} {$ticket_statustext}
    Category: {$ticket_category}Priority: {$ticket_prioritytext}Support Group: + + {if $ticket_forwardedGroupName eq "0"} + {$public_sgroup} + {else} + {$ticket_forwardedGroupName} + {/if} + +
    Assigned To: {if $ticket_assignedTo neq ""} {$ticket_assignedToText} {else} {$not_assigned} {/if}
    + + + + + {foreach from=$ticket_replies item=reply} + + + + {/foreach} + + {if $ticket_status eq 3} + + + + {/if} + + + + + +
    +

    + {$reply.timestamp} + {if $reply.permission eq '1'} + {if isset($isMod) and $isMod eq "TRUE"} {$reply.author}{else} {$reply.author} {/if} + {else if $reply.permission gt '1'} + {if isset($isMod) and $isMod eq "TRUE"} {$reply.author}{else} {$reply.author} {/if} + {/if} +

    +

    {if $reply.hidden eq 1}{/if}{$reply.replyContent}{if $reply.hidden eq 1}{/if}

    +
    +

    Ticket is closed.

    +
    + + {if $ticket_status neq 3} + {$t_reply}: +
    + +
    +
    + +
    +
    +
    + {if isset($isMod) and $isMod eq "TRUE"} +
    + +
    +
    + Hide reply for user. +
    +
    +
    + {/if} + {/if} + {if isset($isMod) and $isMod eq "TRUE"} +
    + +
    + +
    +
    +
    + +
    + +
    +
    + {/if} + + +
    + +
    + +
    +
    + +
    +
    +
    +
    + + + +
    +
    +

    Actions

    +
    + + +
    +
    +
    +
    + + {if isset($isMod) and $isMod eq "TRUE"} + + Ticket Assigning + {if $ticket_assignedTo eq 0} +
    + + + +
    + {else if $ticket_assignedTo eq $user_id} +
    + + + +
    + {/if} + + {if isset($ACTION_RESULT) and $ACTION_RESULT eq "SUCCESS_ASSIGNED"} +
    + {$success_assigned} +
    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "SUCCESS_UNASSIGNED"} +
    + {$success_unassigned} +
    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "TICKET_NOT_EXISTING"} +
    + {$ticket_not_existing} +
    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "ALREADY_ASSIGNED"} +
    + {$ticket_already_assigned} +
    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "NOT_ASSIGNED"} +
    + {$ticket_not_assigned} +
    + {/if} + + Forward to Group +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    + {if isset($ACTION_RESULT) and $ACTION_RESULT eq "INVALID_SGROUP"} +
    + {$invalid_sgroup} +
    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "TICKET_NOT_EXISTING"} +
    + {$ticket_not_existing} +
    + {else if isset($ACTION_RESULT) and $ACTION_RESULT eq "SUCCESS_FORWARDED"} +
    + {$success_forwarded} +
    + {/if} + {/if} + Other actions +
    + + +
    +
    +
    +
    +
    +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_ticket_log.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_ticket_log.tpl new file mode 100644 index 000000000..f7d065306 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_ticket_log.tpl @@ -0,0 +1,38 @@ +{block name=content} +
    +
    +
    +

    Log of Ticket #{$ticket_id}

    +
    + + +
    +
    +
    +
    + Title: {$ticket_title} + + + + + + + + + + {foreach from=$ticket_logs item=log} + + + + + + {/foreach} + + +
    IDTimestampQuery
    {$log.tLogId}{$log.timestamp}{$log.query}
    +
    +
    +
    +
    +{/block} + \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_user.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_user.tpl index 0b2a57c2b..91bdc683f 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_user.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_user.tpl @@ -17,6 +17,15 @@ Email: {$mail} + + + Role: + + {if $userPermission eq 1}User{/if} + {if $userPermission eq 2}Moderator{/if} + {if $userPermission eq 3}Admin{/if} + + {if $firstName neq ""} Firstname: @@ -68,6 +77,20 @@
  • Edit User
  • Send Ticket
  • + {if isset($isAdmin) and $isAdmin eq 'TRUE' and $target_id neq 1} + {if $userPermission eq 1} +
  • Make Moderator
  • +
  • Make Admin
  • + {else if $userPermission eq 2 } +
  • Demote to User
  • +
  • Make Admin
  • + {else if $userPermission eq 3 } +
  • Demote to User
  • +
  • Demote to Moderator
  • + {/if} +
  • + {/if} + @@ -90,6 +113,7 @@ + @@ -99,11 +123,12 @@ {foreach from=$ticketlist item=ticket} - + + - + {/foreach} diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/libuserlist.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/syncing.tpl similarity index 75% rename from code/ryzom/tools/server/ryzom_ams/www/html/templates/libuserlist.tpl rename to code/ryzom/tools/server/ryzom_ams/www/html/templates/syncing.tpl index 645de53f2..56bd0cca3 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/libuserlist.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/syncing.tpl @@ -3,7 +3,7 @@
    -

    {$libuserlist_title}

    +

    {$syncing_title}

    @@ -13,10 +13,10 @@
    -

    {$libuserlist_info}

    +

    {$syncing_info}

    {if $shard eq "online"}
    - {$shard_online}{$libuserlist_sync} + {$shard_online}{$syncing_sync}
    ID Title Timestamp Category
    {$ticket.title}{$ticket.tId}{$ticket.title} {$ticket.timestamp} {$ticket.category}{$ticket.statusText}{if $ticket.status eq 0} {/if} {$ticket.statusText}