goguma v0.7.0 Release highlights: - File uploads via the soju.im/filehost IRC extension - New look: Goguma now uses Material You - Many improvements to the iOS port, including support for push notifications - Goguma now appears as a possible target when sharing text or media from other applications Eli Schwartz (1): commands: fix kick to accept kick reasons Jean THOMAS (11): widget/composer: wrap in SafeArea ios: add flutter_apns_only dep and upgrade pods ios: Add entitlement for photo library access composer: Enclose modal sheet in SafeArea ios: Update Cocoapods lock file ios: Add entitlements file ios: Add release-specific entitlement ios: Disable background location ios: Implement Share Extension README: Add iOS build instructions ios: adjust ShareExtension/Info.plist Simon Ser (61): client: add ERR_NOSUCHSERVER to possible WHOIS replies page/buffer_list: stop using red for unread count Add support for file uploads widget/composer: remove double quotes Upgrade dependencies Upgrade dependencies page/buffer: wait for full sync before displaying parted banner main: drop void_checks lint rule Use ConnectionTask to cancel pending sockets Upgrade dependencies Add support for APNs Upgrade dependencies irc: ignore highlights in URLs apns: pass environment to pushgarden Turn on directives_ordering lint widget/composer: encode UTF-8 filenames in Content-Disposition Register ourselves as a share handler page/share: use a more explicit page title page/buffer: fix route args in BufferPage.open Upgrade app_links to v4.0.0 main: only fetch initial shared media if irc:// URI is unset Upgrade connectivity_plus to v6 Upgrade share_plus to v8 Upgrade dependencies client: add null check for _lastConnectTime app: auto-reconnect in AppLifecycleState.inactive main: don't call Client.connect() on startup Use "dart run" instead of "flutter pub run" Add support for STATUSMSG page/buffer: always show sender line for channel-context/STATUSMSG irc: fix prefix sort in updateIrcMembership() client: add onError callback to Stream.listen() app: improve auto-reconnect logic robustness client_controller: print network sync errors client_controller: make push setup part of network sync client_controller: remove unnecessary then() Upgrade dependencies Upgrade flutter_lints to v4 Switch to Material 3 page/buffer: fix link underline color app: unify AppLifecycleState handling client_controller: rename disconnect() and disconnectAll() client_controller: document that add() takes ownership of the Client app: kill connections when detached app: take auto-reconnect locks into account when killing connections android: drop google-services Gradle plugin ci: drop --android-project-arg=firebase=true android: migrate to Gradle declarative plugins Upgrade app_links to v6 Upgrade flutter_local_notifications to v17 Upgrade share_plus to v9 Upgrade geolocator to v12 Upgrade sentry to v8 Upgrade dependencies android: turn on desugaring client_controller: skip notification permission dialog when detached client_controller: wait for DB.storeNetwork() Leave url_launcher mode as default main: conditionally register main isolate port android: upgrade Kotlin to 1.8.22 Bump version to 0.7.0 delthas (7): Enable users to upload images from their IME commands: add /part page/buffer: Make invisible compact message spacing unselectable page/buffer: Fix spacing in compact mode tool/gen_main: Fix import order page/buffer: fix interline height in compact mode Use system theme accent color sewn (1): doc/notifications: mention official F-Droid repo lacking firebase
goguma v0.6.0 Release highlights: - Initial release with iOS support. - Add support for the draft/pre-away IRC extension, to not toggle the away flag when synchronizing chat history in the background. - Add support for geo URIs and sharing current geolocation - Add a few more commands (/join, /kick, /mode, /quote) As usual, a collection of bugfixes is also included. Jean THOMAS (5): ios: Add encryption exemption entitlement buffer: Fix semantics for message time buffer_list: Stop reading channel initial (a11y) ios: Fix Xcode 15 issues ios: Add support for irc/ircs URIs Simon Ser (94): Parse OpenGraph image attributes for link previews link_preview: add minimum image dimension link_preview: fix HTML peeking link_preview: peek at HTML more aggressively page/buffer: fix blank history when chathistory is disabled link_preview: turn off unnecessary_import lint link_preview: accepts floats for og:image:width link_preview: disable OpenGraph image when dimension is not specified widget/link_preview: open web page previews in a browser link_preview: fix RangeError in LinkPreviewer._findBodyTag link_preview: fix ArgumentError in _fetchHtmlPreview linkify: make double-quote a trailing URL character database: fix missing WebPushSubscription table database: don't use semicolons in SQL statements Bump version to 0.5.0 Upgrade dependencies readme: add link to official F-Droid repository Revert "Upgrade dependencies" Upgrade dependencies readme: remove language code from F-Droid link Upgrade dependencies doc: add index, link from main README readme: fix link to docs doc/android-debugging: add note about filtering logs Revert "Upgrade dependencies" ci: explicitly switch to java-11-openjdk Upgrade dependencies Upgrade dependencies Upgrade connectivity_plus to 4.0 Upgrade share_plus to 7.0 Upgrade flutter_local_notifications to 14.0 android: upgrade build.gradle ci: document root cause of archlinux-java workaround ci: switch to Java 17 page/buffer: ensure "jump to bottom" button is hidden at bottom irc: use RFC 2812 default for CHANTYPES irc: add RFC 2812 default for PREFIX Upgrade linkify to 5.0 and flutter_linkify to 6.0 Upgrade dependencies Add message sheet Resolve linter warnings Bump Flutter dependency notification_controller: only handle app launch selection once Upgrade dependencies android: update Gradle android: move namespace to build.gradle Upgrade dependencies android: remove white hash outline from ic_launcher_foreground android: add night launch_background android: use same pathData as ic_launcher_foreground in ic_stat_name android: add monochrome icon client: add Client.setAway() Add support for draft/pre-away client: only send prereg AWAY if we're requesting the cap Store network-wide last delivery time Bump network last delivery time when receiving NOTICEs ci: remove yay workaround for Java version Add an app store exception to the license Upgrade dependencies page/buffer: drop text selection in message bubbles Use super parameters Upgrade flutter_lints to v3 Drop unused widget parameters Extract commands logic commands: add /join commands: add /kick commands: add /mode commands: add /quote Disable autocorrect on server/nickname/username text fields readme: add links to proprietary stores client_controller: only attempt background service on Android readme: note that iOS is supported doc/compatibility: new page linkify: add support for geo URIs Add menu to share current location widget/composer: replace add menu with bottom sheet widget/composer: use explicit type args for showModalBottomSheet widget/composer: dismiss bottom sheet on tap app: disable Material 3 Upgrade dependencies readme: drop link to Android CI Add .b4-config Upgrade dependencies firebase: detect token changes on startup client_controller: request notification permission android: revert to flutter.minSdkVersion Upgrade flutter_local_notifications to v16 Upgrade connectivity_plus to v5 client: add connectErrors stream Show connection error in settings page/network_details: add reconnect button page/network_details: show connection error if any page/network_details: hide conversation count if empty Bump version to 0.6.0
goguma v0.5.1 Simon Ser (6): page/buffer: fix blank history when chathistory is disabled linkify: make double-quote a trailing URL character database: fix missing WebPushSubscription table Bump version to 0.5.0 ci: explicitly switch to java-11-openjdk Bump version to 0.5.1
goguma v0.5.0 Highlights for this release: - Image previews - Support for UnifiedPush to deliver notifications - Performance improvements when loading messages in a conversation - Conversations can be archived - The composer now supports multi-line messages - The labeled-response, reply-tag and channel-context IRCv3 extensions are now supported Full commit history below. Jean THOMAS (2): ios: Add support lib: Add iOS init code for notifications Simon Ser (177): Upgrade dependencies client: fix fetchReadMarker reply handler Extract composer in separate widget widget/composer: split long text into multiple messages Remove stale bouncer networks client_controller: drop unnecessary cast Drop support for soju.im/read page/buffer: make message text selectable irc: add IrcMessage.copyWith() client: fix infinite loop in ClientMessage.batchByType() client: add ClientBatch.tags client: add ClientMessage.label client: add support for labeled-response doc/permissions: new page ci: clone flutter repo instead of using AUR package irc: relax *LEN ISUPPORT parsing android: remove permissions we don't need Upgrade dependencies Annotate background handlers with @pragma('vm:eFull commit history below.ntry-point') client_controller: pass Client and NetworkModel in errors stream app: only offer to change password if SASL PLAIN is setup widget/composer: fix failed assert on servers missing echo-message irc: add ERR_CANNOTSENDTOCHAN and ERR_NOTEXTTOSEND client: add sendTextMessage widget/composer: use Client.sendTextMessage() client: fix echo-message disabled by mistake client: improve sendTextMessage robustness without labeled-response app: print number of networks when multiple are disconnected app: fix stuck banner indicating disconnected servers doc/connect: add documentation for connection page/buffer: simplify PopupMenuButton callback Load messages in chunks from the DB database: fix SQL error on Android page/buffer: fix unread counter not being cleared page/buffer: move context.read() calls to the top database: fix and optimize DB.listMessagesBefore() Use PlatformDispatcher.instance.onError page/buffer: disable text selection for timestamp Add support for UnifiedPush Unregister push subscriptions client_controller: create new subscription when refresh fails unifiedpush: log message in onUnregistered unifiedpush: log selected distributor unifiedpush: stop unregistering in _handleMessage Upgrade dependencies doc/notifications: indicate that UnifiedPush is supported notification_controller: fix typo in error message push: fix tapping notification when app is running Introduce WebPushSubscriptionEntry.tag firebase: parse subscription resource URL from HTTP response linux: add hacky Flatpak builder manifest client: handle ERR_BADCHANMASK as JOIN reply firebase: move initPush wrapping to firebase.dart tool/gen_firebase_options: exit with non-zero code on bad arg syntax Generate alternative main() function Upgrade dependencies notification_controller: use a singleton notification_controller: don't pick an in-use ID doc: add instructions to get Android logs widget/composer: prevent virtual keyboard from being closed on submit Upgrade dependencies Use ratified extended-monitor cap name Upgrade dependencies Wipe push subscriptions on provider change unifiedpush: use same singleton pattern as NotificationController Add basic image previews page/buffer: display progress indicator for link previews page/buffer: add error widget for link previews Cache metadata for link previews Extract link preview UI into separate widget widget/link_preview: split photo preview into separate widget widget/link_preview: use const and Key in constructors page/buffer: fix extra spacing due to link previews page/buffer: use DefaultTextStyle for links linkify: drop textStyle argument page/buffer: drop textStyle variable dialog/edit_profile: validate nickname page/join: validate nicknames and channel names page/join: trim query page/join: locally filter LIST replies Stop opening notifications for NOTICE and CTCP Improve NOTICE and CTCP handling database: optimize fetchBuffersLastDeliveredTime() database: optimize fetchBuffersUnreadCount() database: fix type cast error firebase: print HTTP response body on error database: refactor schema initialization and migrations database: fix unread count for new conversations database: rename fetchBuffers{UnreadCount,LastDeliveredTime} Fix buffer unread count on startup when last_read_time is unset network_state_aggregator: expose a set of faulty networks Don't close unrelated SnackBars on network state change app: drop unnecessary fallback for faulty network name network_state_aggregator: remove unnecessary import Upgrade dependencies Introduce basic logging infrastructure logging: move uncaught exception handling over link_preview: protect against empty host linkify: ensure recognized URLs pass Uri.parse() Upgrade dependencies android: update proguard-rules.pro Add support for Sentry/Glitchtip error reporting client_controller: ignore result of Client.connect() client: fix StateError in Client._waitMessage() page/connect: fix StateError in _fetchAvailableCaps() client: extract socket monitoring to separate function page/buffer: check mounted before setState() page/connect: don't call setState() if unmounted in _handleServerFocusChange() client_controller: catch exceptions in FlutterBackground.enableBackgroundExecution() client: ignore Socket.close()'s Future client: fixup outdated comment Turn on unawaited_futures lint client: throw exception when RPL_ENDOFNAMES is missing RPL_NAMREPLY linux: add boilerplate files irc: add IrcMessage.paramAt() client: don't crash on missing PONG param irc: override operator [] for IrcMessage.params logging: ignore SocketException page/edit_bouncer_network: check mounted before using context Upgrade dependencies android: upgrade kotlin_version to 1.8.0 page/buffer: don't set onSwipe when composer is hidden android: update gradle to 7.6 firebase: check whether token is null in init() page/buffer: retain composer state when canSendMessage changes Archive conversations Upgrade to Flutter 3.7 page/buffer: fix unnecessary ! operator Fix Flutter 3.7 deprecations Upgrade dependencies ansi: fix stripping hex colors with both foreground and background page/buffer: fix PopupMenuItem text when channel is parted client_controller: more push subscription logging Upgrade dependencies main: log when clearing push subscriptions client_controller: only delete old push subscription on FAIL WEBPUSH unifiedpush: add timeout for createSubscription() client: add timeouts for webPush{Register,Unregister} page/gallery: introduce simple gallery Add missing gallery changes client: add default timeout for _waitMessage() client_controller: skip NOTICEs for archived buffers irc: implement IrcNameMap.containsKey() page/buffer: refuse to reply to users who left the channel unifiedpush: log endpoint updates unifiedpush: drop unregistered instances from DB unifiedpush: log failed registrations unifiedpush: add TODO to properly cleanup registration in callback Replace flutter_typeahead with flutter_flipped_autocomplete page/buffer: show SnackBars above Composer page/buffer: rename joinBanner to banner page/gallery: animate page transitions page/buffer: fix FloatingActionButton hero tag conflict widget/composer: escape text starting with "/" in setTextPrefix() page/buffer: fix composer hidden when keyboord shows up page/buffer: fix duplicated image previews in compact mode widget/composer: set +draft/reply tag database: add Message.network_msgid column database: use "SELECT *" database: fix typo in network_msgid column references Show message reply indicator page/{buffer,network}_details: make MOTD/topic text selectable page/buffer: don't fetch more history if already loaded models: skip notifyListeners() when BufferModel.addMessages() is no-op page/buffer: jump to unread indicator page/buffer: make reply chip clickable page/buffer: make parent message blink page/buffer: set _MessageItem.onMsgRefTap return type page/buffer: don't mark read if not scrolled to bottom page/buffer: drop unused variable page/buffer: add placeholder Use unifiedpush_android fork Upgrade dependencies page/buffer: fix last messages hidden when opening virtual keyboard logging: don't report silent errors to sentry main: make _waitNetworkOnline async main, unifiedpush: use more detailed TimeoutExceptions delthas (8): Order buffers and buffer members in a case-insensitive order page/join: display the number of users per channel Store bouncer network names locally Support @+draft/channel-context Fix regression in compact message formatting page/buffer: Support link previews in compact mode ansi: Fix rendering hex colors Do not crop images horizontally
goguma v0.4.1 This release intends to fix the Goguma build in the official F-Droid repository. Simon Ser (2): Add PushController abstraction Bump version to 0.4.1
goguma v0.4.0 Highlights for this release: - Add support for push notifications. - References to IRC channels are linkified, and IRC URLs are handled. - Add support for the new draft/read-marker IRC extension, superseding the older soju.im/read extension. - The "/me" command has been implemented. - Numerous other enhancements and fixes. Full commit history below. Simon Ser (125): Upgrade dependencies android: upgrade Gradle Fix use_build_context_synchronously analysis Fix library_private_types_in_public_api analysis Add support for soju.im/webpush doc/notifications: update for web push android: add version name suffix for Firebase builds client_controller: extend workmanager sync freq with webpush android: set minSdkVersion to 19 android: add project property for applicationIdSuffix Improve Firebase initialization logging firebase: check whether Play Services are available client_controller: use high freq sync job when Firebase is unsupported firebase: fix typo in comment android: use + for version name metadata separator page/network_details: fix BOUNCER DELNETWORK command page/network_details: hide edit/delete buttons for non-bouncer page/buffer_list: suggest adding a new network page/buffer_details: show edit topic button when NAMES isn't loaded irc: fix ISUPPORT unescaping irc: store raw ISUPPORT values irc: add IrcIsupportRegistry.format() Cache ISUPPORT in the database firebase: use cached ISUPPORT instead of hardcoded defaults firebase: check if target is channel instead of checking own nick firebase: show INVITE notifications ci: remove unnecessary android-platform dependency firebase: fix crash on unknown push endpoint ci: migrate to new server for F-Droid repo ci: include commit hash in version name app: make state private app: simplify ConnectPage in _handleGenerateInitialRoutes irc: fix switch style in parseServerUri page/edit_network: make network arg optional Add basic irc:// URL handling on Android Fix MissingPluginException on startup on Linux irc: introduce IrcUri Migrate app_links handling to IrcUri app: add basic handling for user/channel in IRC URIs Rename EditNetworkPage to EditBouncerNetworkPage page/edit_bouncer_network: make state private client: add {add,change}BouncerNetwork page/edit_bouncer_network: don't dismiss page while loading page/settings: clear bouncer network list on logout page/settings: don't delete servers page/settings: stop throwing an Exception when missing main network models: replace hashValues with Object.hash Upgrade dependencies page/edit_bouncer_network: fix invisible submit button page/edit_bouncer_network: auto-join target on submit client: add deleteBouncerNetwork Remove unused variable and import irc: add {parse,format}AvailableIrcCaps client: add Client.fetchAvailableCaps client: allow overriding requested caps client: add option to disable registration in connect() page/connect: peek server caps page/connect: only request sasl cap when testing connection page/connect: emty password field when SASL is unsuported page/connect: make submit() private page/connect: make ConnectPage state private irc: add IrcAvailableCapRegistry page/buffer: make state private page/buffer_list: make state private database: add Entry suffix to WebPushSubscription page/buffer_details: make state private database: improve _getBasePath style Cache available caps in the DB app: move initialRoute logic to initState app: remove outdated TODO models: fix switch style irc: annotate overridden toString method Cache bouncer host/port in the DB app: use cached bouncer network URI when handling IRC URI page/edit_bouncer_network: check main network is a bouncer irc: decode before applying heuristic to choose type in IrcUri irc: add missing slash in IrcUri.toString app: use cached caps to check for bouncer in _handleAppLink app: handle initialUri when networks are configured linkify: add support for IRC URLs linkify: use our own linkifier for HTTP URLs app: remove unused variable page/settings: use SwitchListTile page/buffer_details: indicate when a channel is moderated page/buffer_details: use constants instead of hardcoded membership prefixes Add support for draft/read-marker page/network_details: indicate whether user is logged in client: add authWithPlain Add dialog to authenticate client_controller: only setup sync once clients are registered client_controller: avoid fetching read markers unnecessarily linkify: handle channel names network_state_aggregator: use Enum.index page/buffer_details: hide unauthenticated tile without SASL page/network_details: use ElevatedButton for delete dialog page/network_details: add logout button page/buffer: handle multi-line pastes in composer page/buffer: don't overwrite composer text on swipe client_controller: don't always create new user buffers webpush: handle OperationError firebase: handle MARKREAD messages Add button to update credentials on ERR_SASLFAIL client_controller: update NetworkModel.nickname on RPL_WELCOME Store SASL username in DB widget/network_indicator: simplify listeners app: call _handleNetworkStateChange in _initState buffer_list: add placeholder for empty search results Remove unnecessary variables and imports page/settings: add confirmation dialog for logout client_controller: stop sending WHO for old user buffers irc: parse RPL_AWAY in reply to WHOIS page/settings: show non-bouncer network entries client: add support for multiple targets in JOIN client_controller: re-join on reconnect firebase: fix MARKREAD when running in foreground firebase: comment out unused variable page/buffer_details: strip ANSI from realnames page/buffer: fix crash when navigating away before history is loaded Upgrade dependencies firebase: don't show notifications for muted buffers page/{buffer,buffer_list}: retain scroll position on reconnect Upgrade dependencies Add basic support for /me command page/join: use a short timeout for LIST Bump version to 0.4.0 delthas (2): Fix crash on tapping "New network" Add support for hex color code escapes
goguma v0.3.0 Pedro Lucas Porcellis (1): android: make https links to open on their default handler Simon Ser (61): page/buffer_list: add placeholder client: always close socket on registration error client: log reconnect errors page/buffer_list: make _BufferListPlaceholder constructor const Open notification on INVITE client: add Client.motd page/network_details: display MOTD client_controller: check network state in RPL_ENDOFMOTD handler page/network_details: show confirmation dialog before deleting network app: fix catchError callback type Fix handling for bouncer network delete notification client: close socket on any PING error page/network_details: remove unused variable page/network_details: fix showDialog type inference page/network_details: s/FlatButton/TextButton/ Turn on avoid_catches_without_on_clauses lint main: use FlutterError to handle uncaught exceptions main: exit on Error client: throw StateError if connect() is called after disconnect() client: log when sending message while connection is closed client: rename disconnect() to dispose(), add logging main: always print a detailed message on uncaught error main: only exit on Error page/edit_network: use slightly more user-friendly field names page/edit_network: move network name to advanced settings, make optional Rename network settings route readme: include branch name in CI links app: catch reconnect exceptions in _pingAll client: fix null dereference in send() client: error out in _waitMessage if connecting page/join: don't setState if unmounted Upgrade dependencies notification_controller: remove previous notification from _active list Migrate to launchUrl Stop using accentColor page/buffer: simplify boxColor logic models: make BufferModel._typing final Disable prefer_is_not_empty/prefer_is_not_operator in analyzer Fix unnecessary_this analyzer items Always use LaunchMode.externalApplication linkify: throw exception on launchUrl failure notification_controller: fetch active notification messaging style Split ANSI functions into separate file Send ACK when running background sync Introduce Prefs client: throw StateError when dispose() is called twice ci: count commits in origin/master for build number Catch errors in workmanager dispatcher page/buffer: fix date indicator with invalid day Stop sending an ACK from workmanager prefs: add workaround for shared_preferences client_controller: re-format ClientProvider constructor client_controller: make ClientController constructor private client_controller: take Prefs in connectParamsFromServerEntry main: add _initModels notification_controller: ignore UnimplementedError for launch details Run sync job in separate Isolate when triggered from the background Add environment variable for workmanager debugging readme: fix link to Android CI notification_controller: fix ArgumentError with high IDs Bump version to 0.3.0 delthas (5): buffer: Fix compact message text Move network & bouncerNetwork state formatter to models Add a network_details page Support typing indicators Add IRC color formatting to the alternate compact buffer list
goguma v0.2.0 Noah Loomans (1): page/buffer: render action msgs as annoucements Simon Ser (263): pubspec: specify flutter version constraint irc: IRCMessage → IrcMessage irc: IRC → Irc throughout models: prioritize custom bouncer network name, if any client: add Client.who Fetch buffer user realname client-controller: fix bouncer network linking when already known client-controller: fetch realname when receiving direct message client-controller: simplify ClientController._handleChatMessages models: filter out meaningless realnames Set Android notification timestamp readme: add contributing section connect-page: turn off auto-reconnect Handle ERROR messages client: explain why we send messages in bulk when connecting models: add assertions to BufferModel.{addMessage,populateMessageHistory} models: remove unnecessary list addition in BufferModel.populateMessageHistory models: add messages to BufferModel in bulk models: sort messages in BufferModel.addMessages client: add more chathistory helpers buffer-page: implement basic infinite scrolling irc: rename IrcPrefix to IrcSource irc: make params arg mandatory in IrcMessage android: add Triple-T metadata android: upgrade Gradle irc: add support for MONITOR ISUPPORT, add MONITOR constants client: add support for MONITOR Use MONITOR for user buffers models: split BufferModel fields a bit buffer-list-page: open buffer when joining channel join-dialog: move onSubmit logic over join-dialog: make network a late field join-dialog: make nameController field final Revert "android: upgrade Gradle" network-indicator: extract refresh indicator in separate widget network-indicator: make NetworkListIndicator state private Add refresh indicator to BufferPage network-indicator: create AnimationController in initState network-indicator: remove intermediary Stack when hidden buffer-page: add autocomplete for channel members buffer-page: lower auto-complete debounce duration client-controller: handle KICK messages Introduce NotificationController Cancel active notifications Upgrade flutter_local_notifications notification-controller: query active notifications on startup notification-controller: bump notification ID on startup Add default cases for enum switches Remove unused imports Remove unused variables client-controller: explicitly return null network-state-aggregator: add missing super.dispose() call Fix analyzer errors and warnings ci: enable analyzer and linter ci: ignore linter for now Add dark theme android: stop relying on `flutter create` buffer-page: disable infinite scrolling on chathistory-less servers connect-page: fix catchError function type connect-page: mark password as required on FAIL ACCOUNT_REQUIRED Rename filenames to use underscores instead of hyphens Move pages and widgets into their own sub-directory page/buffer: remove debugging print Remove unnecessary "new" keywords Add missing function return types Only print all IRC messages in debug mode client: add _roundtripMessage client: replace Client.batches with ClientEndOfBatch client: introduce Client.isNick irc: add support for WHOIS client: add support for WHOIS page/buffer_details: display WHOIS info readme: add more screenshots readme: reduce screenshot width a bit Fix analyzer errors client_controller: fix spurious background service permission nag client_controller: remove outdated TODO readme: add link to IRC channel irc: add WhoReply client: make it so Client.who returns parsed replies page/buffer_details: show offline and away status page/buffer_details: don't WHOIS offline users Add support for the setname extension Switch on the draft/extended-monitor extension Add support for the away-notify extension irc: sort ISUPPORT tokens alphabetically irc: add support for the BOT ISUPPORT token irc: add support for RPL_WHOISBOT page/buffer_details: show bot status irc: clear IrcIsupportRegistry.botMode Add support for WHOX client: add Client.join page/buffer: display banner when channel isn't joined client_controller: handle KICK targeted to us widget/join_dialog: remove unused import page/buffer_details: fix pluralization for member list Split GogumaApp into separate file page/buffer: show time in message bubbles page/buffer: show date marker database: cache parsed message in MessageEntry database: cache DateTime in MessageEntry Open a single notification per buffer, use MessagingStyle notification_controller: remove network sub-text ci: set version code readme: add CI badge ci: deploy to F-Droid repo Add workaround for Let's Encrypt certs on Android 7 app: rename GogumaApp to App Switch to named routes widget/join_dialog: add JoinDialog.show page/buffer: show date/times in local timezone page/buffer_list: use AnimatedBuilder for BufferItem page/buffer_list: use AnimatedWidget page/buffer_list: make fields and methods private page/buffer: make fields and methods private widget/join_dialog: make fields and methods private page/buffer: add missing FocusNode.dispose() call Address some analyzer issues Stop using FlatButton Make all StreamControllers synchronous notification_controller: s/payload/tag/ notification_controller: set MessagingStyleInformation.groupConversation notification_controller: make initialize async notification_controller: rename private field irc: fix IrcSource parsing without host client: ensure all incoming messages have a source irc: make IrcIsupportMembership constructor const client: "*" is never a nick client: convert double-quoted strings to single-quoted client: increase connection registration timeout ci: use a different filename for each deployment ci: fix command to cleanup old deployed apk files client: add autoReconnect setter client_controller: introduce ClientAutoReconnectLock notification_controller: remove unnecessary import irc: switch to generic function type alias for CaseMapping client: annotate overridden getter ClientMessage.source database: switch to async/await Don't assign to void client: add Client.setTopic Add UI to edit channel topic Add support for TOPICLEN irc: add support for ISUPPORT CHANMODES Handle channel MODE messages irc: add standard user and channel mode constants client: add Client.fetchMode client_controller: split channel mode handling to separate function page/buffer_details: take +t channel mode into account page/buffer_details: add indicator for invite-only channels client: fix client opening two connections client: ensure any previous connection is closed in connect() client: always cancel reconnect timer in _tryAutoReconnect() irc: add constants for standard and widely used memberships irc: add WhoxField.toString irc: parse channel and membership in WhoReply client: ignore invalid UTF-8 irc: only trim CRLF in IrcMessage.parse page/buffer_details: request member list via WHO irc: add isStubRealname page/buffer_details: display members realname Add support for soju.im/no-implicit-names client: simplify setTopic and fetchMode a bit client: don't ignore errors from previous WHO commands Auto-complete channel names page/buffer_details: drop unused _membershipLevel function irc: mark more constructors as const Display network name for dup channel/nick names irc: parse WhoxField.account widget/edit_topic_dialog: make constructor const irc: add support for ISUPPORT ELIST irc: add support for RPL_LIST client: add Client.list Revamp join page page/join: use isStubRealname page/join: show progress indicator when loading page/join: fix race conditions client: ensure at most one LIST command is running at a time page/join: annotate overridden _JoinItem.build Fix ListTile.title colors with rich text page/join: don't refresh if query didn't change Extract logic to open buffer into public function page/buffer_details: open buffer on channel/member tap page/join: remove unused import notification_controller: return futures app: fix route stack on initial launch page/connect: use async/await page/join: sort channels by number of members page/join: use async/await in _search page/buffer: use async/await client_controller: use async/await Move join() to page/buffer.dart page/buffer: don't send JOIN if already joined client_controller: reset online/away status when disconnected page/join: avoid control flow in finally block client: use async/await client: rework state and auto-reconnect handling client: use rethrow client: don't overwrite connecting state when socket is closed main: use async/await client: fix missing await in _roundtripMessage call page/buffer: make composer text field grow on long message page/buffer_list: extract background service banner into widget page/buffer_list: get ClientProvider from context widget/network_indicator: read NetworkListModel from context main: add explicit cast for SendPort page/buffer_list: annotate overridden method client: keep track of our realname Add a settings page page/buffer_list: inline _buildSearchField page/buffer_list: remove context arg from _markAllBuffersRead page/settings: take bouncer network state into account notification_controller: enable notification lights irc: make nick comparison case-insensitive in isStubRealname notification_controller: add method to format buffer tag page/buffer: create banner, message list and composer separately page/buffer: add button to jump to bottom page/buffer: use 8-digit hex code for color irc: add support for NICKLEN and NAMELEN client: add Client.setRealname Add dialog to edit nickname widget/edit_profile_dialog: add realname entry client_controller: handle NICK models: make nickname and realname part of the state page/settings: listen to network changes widget/edit_profile_dialog: empty realname field if same as nick widget/edit_profile_dialog: use form validation page/buffer_list: hide trailing Wrap when empty readme: link to new mailing list widget/edit_profile_dialog: save new nick to DB Move dialogs to separate directory pages/settings: fix navigator stack when logging out page/settings: drop unused variable client: handle server-wide broadcasts in isNick Use key in widget constructors Strip ANSI formatting from topic Add some basic docs models: rename BouncerNetwork to BouncerNetworkModel irc: move over NAMREPLY parsing client: parse NamesReply in ClientEndOfNames client: make helper data structure constructors private client: make more constructors const Save default nickname in shared preferences Save realname in shared preferences client: improve ConnectParams formatting client: update ConnectParams on setNickname/setRealname page/settings: rebuild _NetworkItem on BouncerNetworkModel change page/settings: vertically align network icon irc: fix IRCv3 message tag parsing Fix null deref when nick is missing from shared preferences irc: drop unused _unescapeTagRegExp page/settings: make list const database: fix upgrade to version 5 on Android page/settings: hide button to add network without bouncer-networks page/edit_network: simplify url formatting logic page/edit_network: add advanced settings expandable button client: make _tryAutoReconnect always async Fix buffers and notifications opened with no reason notification_controller: handle CTCP messages Upgrade dependencies page/settings: hide edit profile button when offline page/edit_network: improve expand button animation page/edit_network: fix indentation Bump version to 0.2.0+516 delthas (9): Add support for pinned buffers Add support for muted buffers Add an alternative compact message list view Make compatible with Windows Fix unauthenticated subtitle message Store channel topic & user realnames locally Move parseServerUri to irc and make it public Add a network add/edit page Make all buffer list buffer items the same height
goguma v0.1.0 Simon Ser (243): Add app skeleton Add connect form Add missing dispose() impl for BufferListPageState Collect connect form values Add basic IRC client Display channel topic Split IRC wire format functions to separate file Split ConnectPage to separate file Add dialog to join channels Simplify Provider.of Handle TOPIC messages Add BufferItemModel provider for BufferPage Rename BufferItemModel to BufferModel Extract models to separate file Extract BufferPage into separate file Extract BufferListPage into separate file Send PRIVMSG on composer submit Store IRCMessage objects in BufferPage state Add MessageListModel Make IRCMessage and IRCPrefix immutable Nuke MessageListModel Make BufferModel.name final Introduce ServerModel Index BufferModel by server, store in a Map Reverse messages ListView Add ClientController Remove unnecessary GogumaState.dispose() override Remove GogumaState.connect() Add logout menu Allow port in server string Display NOTICE messages in buffer page Add missing client-controller.dart Fix buffer list search field cursor color Open a new buffer on query Maintain a list of available IRC capabilities Initialize Client.nick from ConnectParams Store server prefix in Client.serverPrefix Add ClientSnackbar to display IRC errors Linkify messages Add TODO about credentials storage Fix non-linkified text style in messages Reset version in pubspec.yaml Add AndroidManifest.xml readme: add flutter create commands readme: clarify linux setup Log when opening connection Introduce Client._setState Catch connect() errors Catch Socket errors Upgrade dependencies Hide ConnectForm when loading prefs lib/client: read nick from RPL_WELCOME Upgrade dependencies client: return Future when connecting Display spinner and error message on connect page Add IRCException Implement per-field error messages on connect page Improve server URL sanity checks, allow disabling TLS Add connect timeout client: move socketFuture error handling up client: add timeout for connection registration connect-page: set pass to null if empty client: move RPL_WELCOME state updates to _handleMessage client: add state stream client-snackbar: show client state Introduce ServerListModel models: add ServerModel.host irc: add IRCIsupport helper client: add Client.isupport models: add ServerModel.network irc: add IRCCapRegistry client: clear ISUPPORT when disconnected irc: rename IRCIsupport to IRCIsupportRegistry client-snackbar: clear all previous snack bars client: automatically reconnect Store server settings in SQLite database client-controller: refactor to stop managing ServerListModel models: ensure server is stored in DB when creating BufferModel Store buffers in DB Ensure models are backed by a DB entry Remove buffer from DB when leaving channel Store message history in DB database: turn on ON DELETE CASCADE Hide composer when disconnected android: re-generate app manifest database: minor cosmetic whitespace fixup database: one query per execute call database: drop unnecessary intermediate subdir on Android client-controller: pause stream while handling message client-controller: fix dest buffer on user PRIVMSG/NOTICE irc: add IRCIsupportRegistry.chanTypes Allow nicknames in join dialog Don't send PART when leaving user buffer Add basic buffer unread count Save and restore unread count to DB database: fix broken UPDATE queries Sort buffers by last message time Load initial state from DB concurrently main: remove unused import android: set app icon readme: use --no-overwrite when creating Android app client: add Client.isMyNick irc: parse CASEMAPPING from ISUPPORT client: use case-mapping in Client.isMyNick ci: add manifest to build Android app client-controller: fix JOIN handling models: add case-mapping support for BufferListModel models: don't notifyListeners on no-op ServerModel change irc: add support for CAP ACK/NAK irc: add support for message tags client: enable message-tags irc: make IRCMessage immutable client: request caps on CAP NEW Add support for server-time Add support for echo-message readme: add goals client: make ConnectParams an unnamed arg client: make ConnectParams immutable Add support for SASL PLAIN Don't check sasl cap on RPL_WELCOME readme: add screenshot readme: fix screenshot width Introduce NetworkEntity Add support for soju.im/bouncer-networks Reconnect on initial setup Add basic support for draft/chathistory client: check StreamController.isClosed before sending events client-controller: split into 2 classes client: improve logging client-controller: use latest server delivery time client: add support for batches Use CHATHISTORY TARGETS models: drop MessageModel.buffer database: error out on downgrade client: emit stream errors on socker errors database: fix Buffer.last_read_time not fetched from table Add support for soju.im/read database: drop MessageEntry.flags buffer-list-page: improve channel topic rendering buffer-page: omit subtitle Text if none client: send CAP REQ after NICK+USER connect-page: s/username/nickname/ ci: turn on Android builds readme: add link to Android builds buffer-page: hide sender if same as previous message join-dialog: add dropdown to select server models: s/ServerModel/NetworkModel/ irc: only add colon to trailing message param when necessary irc: add CTCP message parser buffer-page: display CTCP messages buffer-page: linkify CTCP ACTION text irc: add stripAnsiFormatting buffer-page: strip formatting database: simplify fetchBuffersLastDeliveredTime query database: add index for Message table database: drop outdated TODO buffer-page: fade text in page title Periodically send PINGs in the foreground client: cancel reconnect timer on connect and disconnect client: drop unused Future from Client.send Only send regular PINGs on completely connected clients Avoid uncaught exceptions in returned Future objects client: reconnect immediately if last attempt was a long time ago client: fix closed connection signal Don't mark messages as unread when buffer is focused client: make nick, serverPrefix and state read-only database: accept a list when storing messages client: introduce ClientMessage client-controller: handle chathistory batches in bulk client-controller: simplify _handleChatMessages a bit client: add ClientMessage.batchByType client-controller: use ClientMessage.batchByType database: drop orphan Server entries on Network delete Handle FAIL * ACCOUNT_REQUIRED client-controller: better handle server messages main: ensure we don't leak timer in GogumaAppState._enablePingTimer buffer-page: reduce margin between messages from same sender buffer-page: add unread marker client-controller: don't bump unread count if message is already read Add button to mark all buffers as read Add Client.fetchChatHistoryBetween client: add Client.fetchRead Introduce "synchronizing" network state client: drop ClientState.registering Periodically synchronize chat history Open basic notification on direct message client-controller: fix destination buffer for own messages main: fix infinite loop on initial configuration buffer-page: improve link text style Open notification on highlight irc: fix missing fields in IRCIsupportRegistry.clear() irc: parse ISUPPORT PREFIX irc: remove default ISUPPORT CHANTYPES main: only catch Exception objects in catchError client: fix null dereference in Client.disconnect Move connection logic to ConnectPage, remove Goguma widget connect-page: drop ConnectParamsCallback Aggregate status of all networks models: add NetworkModel.displayName main: add network name to status snackbars main: remove outdated TODO models: rename BufferModel.subtitle to topic android: set appCategory android: update app icon android: set notification icon client-controller: set notification category client-controller: create separate notification channel for highlights client-controller: set notification sub-text if appropriate Remove some stray double-quoted strings Use RefreshProgressIndicator to indicate pending connections Simplify GogumaAppState fields buffer-details-page: add basic page buffer-page: wire up BufferDetailsPage menu Use a banner instead of a snack bar Introduce BufferModel.joined Spawn a foreground service on Android when chathistory is unsupported Reconnect on connectivity status change client-controller: don't ask for background service when disconnected Workaround connectivity change events not received on Android buffer-details-page: show network name buffer-page: allow tapping app bar title to open details Extract linkify code into separate file buffer-details-page: linkify topic buffer-details-page: remove outdated TODO doc/notifications: new document client: collect RPL_NAMREPLY messages Introduce MemberListModel buffer-details-page: add member list buffer-details-page: show membership description client: turn on multi-prefix client-controller: reset member list on PART buffer-page: introduce _MessageItem Implement swipe-to-reply buffer-page: set _MessageItem key buffer-page: fix composer text not properly reset buffer-page: don't mark messages read if app isn't in the foreground buffer-details-page: sort members by op level and name buffer-page: set composer TextInputAction buffer-list-page: remove settings meny for now android: setup CI keystore android: check in more files, upgrade gradle android: downgrade gradle pubspec: bump to v0.1.0