* Voice serialization
* Implement `hashCode` and `equals` for `Voice`
* Update test
* Update test
* Add note of `PttMessage.pttInternalInstance`
* Fix logic of `Voice.equals`
* Add more comment about GroupAnnouncement.kt
* Edit comment about GroupAnnouncement.kt
Provide experimental api
* Api Dump
* After review
* Change to interface and API dump
* More change
* More change
* More more change
* Some change
* api dump
* Fix name
* Redesign Announcement public api
* Edit comment about GroupAnnouncement.kt
Provide experimental api
* After review
* Change to interface and API dump
* More change
* Modify to extension fun
* Fix sendAnnouncement and change place
* Change Group.deleteAnnouncement to group companion
* fix publish
* Api dump
* Reformat code
* Add `@since 2.7`
* Fix build
Co-authored-by: Him188 <Him188@mamoe.net>
* Update system face
* Update api dump
* Update api dump for android
* Update system face which updated today
* Update api dump
* Add new system face
* Update apidump
Reconnection is directed by `BotOfflineEvent`.
### Event Broadcasting
- PacketFactory `MessageSvcPushForceOffline` closes network with `ForceOfflineException`.
- `network.close(cause)` pass the cause to state observer from `QQAndroidBot.stateObserverChain`, the observer broadcasts as follows:
- Nothing if `cause` is `ForceOfflineException` or `BotClosedByEvent`(which is broadcast by user)
- `BotOfflineEvent.Dropped` if cause is NetworkException and is recoverable(which is from Netty handlers)
- `BotOfflineEvent.Force` if cause is `ForceOfflineException` is from the factory mentioned above.
- `BotOfflineEvent.Active` otherwise(any other unexpected exceptions considered as an error)
### Deciding whether to reconnect
User can listen and change `BotOfflineEvent.reconnect` to decide. Default values are determined by `BotConfiguration`.
### Event listening
- Component `BotOfflineEventMonitor` listens `BotOfflineEvent`, logs the event for users, and launches a coroutine to do `network.resumeConnection` to notify the selector to renew an instance.
- `BotOnlineWatchdog` in `SelectorNetworkHandler` is removed.
- Selector now handles `maxAttempts` correctly in such a way that `awaitResumeInstance` does not throw exception until maximum attempts reached.
- On every attempt, new exceptions are logged to provide debugging information, and further duplications are ignored.