33#include " api/APIHelp.h"
44#include " api/PlayerAPI.h"
55#include " engine/EngineOwnData.h"
6- #include " ll/api/Logger.h"
7- #include " ll/api/service/Bedrock.h"
6+ #include " ll/api/io/Logger.h"
7+ #include " ll/api/io/FileSink.h"
8+ #include " ll/api/io/PatternFormatter.h"
9+ #include " ll/api/data/IndirectValue.h"
810#include " mc/world/actor/player/Player.h"
9- #include " mc/world/level/Level.h"
1011#include " utils/Utils.h"
12+ #include " lse/api/PlayerSink.h"
1113
1214#include < fstream>
1315#include < iostream>
1416#include < string>
1517#include < string_view>
1618
19+ using ll::io::LogLevel;
20+
1721// ////////////////// Classes ////////////////////
1822
1923ClassDefine<void > LoggerClassBuilder = defineClass(" logger" )
@@ -45,18 +49,36 @@ string& StrReplace(string& str, const string& to_replaced, const string& new_str
4549}
4650// //////////////// Helper //////////////////
4751
48- void inline LogDataHelper (ll::OutputStream* outStream , const Arguments& args) {
52+ void inline LogDataHelper (LogLevel level , const Arguments& args) {
4953 std::string res;
5054 for (int i = 0 ; i < args.size (); ++i) res += ValueToString (args[i]);
51- (*outStream)(res);
55+ switch (level) {
56+ case LogLevel::Fatal:
57+ ENGINE_OWN_DATA ()->getModInstance ()->getLogger ().fatal (res);
58+ break ;
59+ case LogLevel::Error:
60+ ENGINE_OWN_DATA ()->getModInstance ()->getLogger ().error (res);
61+ break ;
62+ case LogLevel::Warn:
63+ ENGINE_OWN_DATA ()->getModInstance ()->getLogger ().warn (res);
64+ break ;
65+ case LogLevel::Info:
66+ ENGINE_OWN_DATA ()->getModInstance ()->getLogger ().info (res);
67+ break ;
68+ case LogLevel::Debug:
69+ ENGINE_OWN_DATA ()->getModInstance ()->getLogger ().debug (res);
70+ break ;
71+ default :
72+ break ;
73+ }
5274}
5375
5476Local<Value> LoggerClass::log (const Arguments& args) {
5577 CHECK_ARGS_COUNT (args, 1 )
5678
5779 try {
5880 auto globalConf = ENGINE_OWN_DATA ();
59- LogDataHelper (&globalConf-> logger . info , args);
81+ LogDataHelper (LogLevel::Info , args);
6082 return Boolean::newBoolean (true );
6183 }
6284 CATCH (" Fail in LoggerLog!" )
@@ -67,7 +89,7 @@ Local<Value> LoggerClass::debug(const Arguments& args) {
6789
6890 try {
6991 auto globalConf = ENGINE_OWN_DATA ();
70- LogDataHelper (&globalConf-> logger . debug , args);
92+ LogDataHelper (LogLevel::Debug , args);
7193 return Boolean::newBoolean (true );
7294 }
7395 CATCH (" Fail in LoggerDebug!" )
@@ -78,7 +100,7 @@ Local<Value> LoggerClass::info(const Arguments& args) {
78100
79101 try {
80102 auto globalConf = ENGINE_OWN_DATA ();
81- LogDataHelper (&globalConf-> logger . info , args);
103+ LogDataHelper (LogLevel::Info , args);
82104 return Boolean::newBoolean (true );
83105 }
84106 CATCH (" Fail in LoggerInfo!" )
@@ -89,7 +111,7 @@ Local<Value> LoggerClass::warn(const Arguments& args) {
89111
90112 try {
91113 auto globalConf = ENGINE_OWN_DATA ();
92- LogDataHelper (&globalConf-> logger . warn , args);
114+ LogDataHelper (LogLevel::Warn , args);
93115 return Boolean::newBoolean (true );
94116 }
95117 CATCH (" Fail in LoggerWarn!" )
@@ -100,7 +122,7 @@ Local<Value> LoggerClass::error(const Arguments& args) {
100122
101123 try {
102124 auto globalConf = ENGINE_OWN_DATA ();
103- LogDataHelper (&globalConf-> logger . error , args);
125+ LogDataHelper (LogLevel::Error , args);
104126 return Boolean::newBoolean (true );
105127 }
106128 CATCH (" Fail in LoggerError!" )
@@ -111,30 +133,21 @@ Local<Value> LoggerClass::fatal(const Arguments& args) {
111133
112134 try {
113135 auto globalConf = ENGINE_OWN_DATA ();
114- LogDataHelper (&globalConf-> logger . fatal , args);
136+ LogDataHelper (LogLevel::Fatal , args);
115137 return Boolean::newBoolean (true );
116138 }
117139 CATCH (" Fail in LoggerFatal!" )
118140}
119141
142+ // Deprecated
120143Local<Value> LoggerClass::setTitle (const Arguments& args) {
121144 CHECK_ARGS_COUNT (args, 1 )
122145 CHECK_ARG_TYPE (args[0 ], ValueKind::kString )
123146
124- try {
125- ENGINE_OWN_DATA ()->logger .title = args[0 ].asString ().toString ();
126- return Boolean::newBoolean (true );
127- }
128- CATCH (" Fail in LoggerSetTitle!" )
129- }
147+ return Boolean::newBoolean (false );
130148
131- // /////////////// Helper /////////////////
132- void UpdateMaxLogLevel () {
133- auto data = ENGINE_OWN_DATA ();
134- data->maxLogLevel = data->logger .consoleLevel ;
135- if (data->maxLogLevel < data->logger .fileLevel ) data->maxLogLevel = data->logger .fileLevel ;
136- if (data->maxLogLevel < data->logger .playerLevel ) data->maxLogLevel = data->logger .playerLevel ;
137149}
150+
138151// /////////////// Helper /////////////////
139152
140153Local<Value> LoggerClass::setConsole (const Arguments& args) {
@@ -144,12 +157,12 @@ Local<Value> LoggerClass::setConsole(const Arguments& args) {
144157
145158 try {
146159 if (args.size () >= 2 ) {
147- ENGINE_OWN_DATA ()->logger .consoleLevel = args[1 ].toInt ();
160+ ENGINE_OWN_DATA ()->getModInstance ()->getLogger ().getSink (0 )->setFlushLevel (static_cast <ll::io::LogLevel>(args[1 ].toInt () + 1
161+ )); // See LSE's definition https://legacy-script-engine.levimc.org/apis/ScriptAPI/Logger/
148162 }
149163 if (!args[0 ].asBoolean ().value ()) {
150- ENGINE_OWN_DATA ()->logger . consoleLevel = 0 ;
164+ ENGINE_OWN_DATA ()->getModInstance ()-> getLogger (). getSink ( 0 )-> setFlushLevel (ll::io::LogLevel::Off) ;
151165 }
152- UpdateMaxLogLevel ();
153166 return Boolean::newBoolean (true );
154167 }
155168 CATCH (" Fail in LoggerSetConsole!" )
@@ -161,14 +174,12 @@ Local<Value> LoggerClass::setFile(const Arguments& args) {
161174 if (args.size () >= 2 ) CHECK_ARG_TYPE (args[1 ], ValueKind::kNumber )
162175
163176 try {
164- string newFile = args[0 ].asString ().toString ();
165- ENGINE_OWN_DATA ()->logger .setFile (newFile, std::ios::app);
166-
177+ std::filesystem::path newFile = std::filesystem::path (args[0 ].asString ().toString ());
178+ std::shared_ptr<ll::io::FileSink> sink = std::make_shared<ll::io::FileSink>(newFile, ll::makePolymorphic<ll::io::PatternFormatter>(" {3:.3%T.} {2} {1} {0}" , ll::io::Formatter::supportColorLog (), 0b0010 ), std::ios::app);
167179 if (args.size () >= 2 ) {
168- ENGINE_OWN_DATA ()->logger .fileLevel = args[1 ].toInt ();
169- UpdateMaxLogLevel ();
180+ sink->setFlushLevel (static_cast <LogLevel>(args[1 ].toInt () + 1 ));
170181 }
171- return Boolean::newBoolean (ENGINE_OWN_DATA ()->logger . ofs . value (). is_open ( ));
182+ return Boolean::newBoolean (ENGINE_OWN_DATA ()->getModInstance ()-> getLogger (). addSink (sink ));
172183 }
173184 CATCH (" Fail in LoggerSetFile!" )
174185}
@@ -180,14 +191,11 @@ Local<Value> LoggerClass::setPlayer(const Arguments& args) {
180191 if (!player) {
181192 return Boolean::newBoolean (false );
182193 }
183- ENGINE_OWN_DATA ()->logger .setPlayerOutputFunc ([uuid (player->getUuid ())](std::string_view str) {
184- ll::service::getLevel ()->getPlayer (uuid)->sendMessage (str);
185- });
194+ std::shared_ptr<lse::io::PlayerSink> sink = std::make_shared<lse::io::PlayerSink>(player->getUuid ());
186195 if (args.size () >= 2 ) {
187- ENGINE_OWN_DATA ()->logger .fileLevel = args[1 ].toInt ();
188- UpdateMaxLogLevel ();
196+ sink->setFlushLevel (static_cast <LogLevel>(args[1 ].toInt () + 1 ));
189197 }
190- return Boolean::newBoolean (true );
198+ return Boolean::newBoolean (ENGINE_OWN_DATA ()-> getModInstance ()-> getLogger (). addSink (sink) );
191199 }
192200 CATCH (" Fail in LoggerSetPlayer!" )
193201}
@@ -198,8 +206,7 @@ Local<Value> LoggerClass::setLogLevel(const Arguments& args) {
198206
199207 try {
200208 auto conf = ENGINE_OWN_DATA ();
201- conf->maxLogLevel = conf->logger .consoleLevel = conf->logger .fileLevel = conf->logger .playerLevel =
202- args[0 ].toInt ();
209+ conf->getModInstance ()->getLogger ().setFlushLevel (static_cast <LogLevel>(args[0 ].toInt () + 1 ));
203210 return Boolean::newBoolean (true );
204211 }
205212 CATCH (" Fail in SetLogLevel!" )
0 commit comments