- for Bilibili
- from "[bilbili] Share video / avXXX/BVXXX" to "[Bilibili] Video avXXX/BVXXX", and also added description
- from "[tweet] Share as VxTwitter/Fix-Tweet" to "[Twitter/X][VXTwitter/Fix-Tweet] $screenName/statusId"
- from "[Xiaohongshu] Share Link [$id]" to "[Xiaohongshu] Note $id.
- also added description.
- if the note is from a share url, then the share url will be show in description
- ShareToolBilibili now searches all the urls in query string, include b23.tv share url, av/BV id, video url, then rewrites them all and outputs.
- ShareToolTwitter now searches all the urls instead of matches in the query string.
- ShareToolXhs now uses searchUrls, instead of old match url or search share text. Also supported multiple urls match in one query.
## 📇 Function & Mechanisms
- add daily event statistics, which collects event processed counts and average consumed time
- can be found using `/info event` or newly added Morny Daily Report
- will reset every 00:00 of report-zone
- add `/info tasks` to monitor current coeur task manager status
- cha Question Mark Reply support `⸘`
- cha bot output supported codeblock language tag (for event_hack output and exception report)
- for inline twittet tweet share
- add FixTweet output format
- removed c.vxtwitter output format (because the upstream default is changed to combined)
- support x.com and fixvx.com and fixupx.com for input
- add some methods that can get social media status' content
- currently support tweeter tweet, and weibo status
- weibo with videos is not supported yet
- add command `/get <status-url>` can get from a url
- add private message listener that can automaticly search supported url from recieved private message and output the status content
- add inline query can output status content by using `<supported-url> get` (or `get <supported-url> is also supported`)
- weibo with pics and twitter with videos is not supported yet
## 🧯 Bug Fix
- fix Telegram User DC matching failure due to cdn domain changed to */cdn-telegram.org
- fix InputCommand throws OutOfBounds when input is empty (aka. only `/` in message text)
- fix wrong time parsing in OnCallMe-last_dinner
## 🔌 for Trusted/Admin
- add Morny Daily Report, will report at 00:00 of report-zone
- now will report daily event statistics
## 🔩 for self-hosted/developer
- add --report-zone startup param to control which time-zone the Daily Report time should aligned to
- default is system default zone
- add err handler for MornyCoeur#eventManager(UpdateListener), now error will not output to stderr but Morny's logger.
- add util.scheduler and MornyCoeur#tasks for task managering
- add MornyCoeur#watchDog
- add EventEnv#timeStartup
- add atEventPost and executeFilter in EventListener
- cha EventEnv#status
- add SttpPublic#mornyBasicRequest and make every Morny's HTTP request using it (eveny request now will take Morny UA)
- Now supported get social content from inline
- use a supported url with prefix or suffix "get"
- only support twitter photos media
- support all types of pure text content.
- trying get non-supported medias may cause failure.
- Now the status of EventEnv is a State array that infers the state history
- State can be OK or CANCELED, and can be set multiple times
- state method can get the last state set, and status method can get the state history
- Default EventListener.executeFilter implementation is changed to true if stats is null
- add consume[T](T=>Unit) for EventEnv, to simplifying the old consume[T](Class[T])(T=>Unit)
- changed execution sort of EventListener in EventListenerManager. Now atEventPost method will be run after all events' normal listeners complete.
- cha OnMedicationNotifyApply will only tag event as OK when the refresh function works (fixed part of the wrong OK state)
- cha MornyOnUpdateTimestampOffsetLock tag event CANCELED but not OK to fix part of the wrong OK state
- add err handler for UpdateListener in MornyCoeur
- for network-related exception, will only output exception basic message and not report.
- for other type of exception, will output all message of exception and do report.
- Scheduler's runnerName now is `$classBaseName@$hashCode`
- add for EventEnv a timeStartup field
- cha EventListener and EventListenerManager
- add for EventListener a method executeFilter used to manager if an event should be run. This replaced the condition statement inside the EventListenerManager
- add for EventListener a method atEventPost, this will run at current event listener is on complete
- add for MornyConfig a reportZone field
- can be set by `--report-zone`
- used for controlling Morny Report daemon uses the zoned time to send report. default is system default time zone.
- add for MornyReport new EventStatistics and DailyReportTask
- add for MornyInformation command new subcommand `event` to manually show MornyReport.EventStatistics info.
- add WatchDog and MornyCoeur.watchDog, used for checking if the machine is in sleep mode and notify the MornyCoeur.tasks to avoid timing problem
- fix CronTask frequency got initialize problem
- add slf4j-nop for project
- add lib cron-utils: v9.2.0
- add CronTask
- add CronTask's test
- change MedicationTimer using cron as time calculation backend (not using CronTask)
- change OnQuestionMarkReply support `⸘`
- minor SchedulerTest "immediately" test logic changes
## 📇 Function & Mechanisms
- add for /encrypt
- add urlencode / urldecode sub-command: they process text input only
- add alias /enc
- add for InlineBilibiliShare
- add b23.tv share-link parse
- add b23.tv video link parse
## 🔩 for self-hosted/developer
- cha EventListener use EventEnv instead of Update
- new LogLevel NOTICE(notice) and ATTION(attention)
- with new formatter
- add MornyLogLevels with new log level NOTICE(notice) and ATTION(attention)
- make mechanic and morny (but not coeur) related INFO to NOTICE, warn to ATTION
- add MornyFormatterConsole to support the formatted time display, and some other formatter changed
- now startup key output will hide key except the starting and ending 4 chars
- change the function definition of consume in EventEnv
- removed src/test/scala/live/LiveMain
- and added gitignore for src/test/scala/live