From 58041d41266cb8d29dfd9fcc16bb4f47ab57ecf6 Mon Sep 17 00:00:00 2001 From: tommyxchow Date: Wed, 20 Oct 2021 05:12:15 -0400 Subject: [PATCH] Refactor IRC functions & tweak padding --- lib/api/irc_api.dart | 22 +++++----------------- lib/stores/chat_store.dart | 33 ++++++++++++++++++--------------- lib/stores/chat_store.g.dart | 17 ----------------- 3 files changed, 23 insertions(+), 49 deletions(-) diff --git a/lib/api/irc_api.dart b/lib/api/irc_api.dart index d18d6ef1..df859bb9 100644 --- a/lib/api/irc_api.dart +++ b/lib/api/irc_api.dart @@ -1,5 +1,3 @@ -// ignore_for_file: non_constant_identifier_names - import 'package:flutter/foundation.dart'; import 'package:frosty/models/irc_message.dart'; @@ -54,13 +52,13 @@ class IRC { } // Applies the given CLEARCHAT message to a list and returns the result. - static List CLEARCHAT({required List messages, required IRCMessage ircMessage}) { + static void clearChat({required List messages, required IRCMessage ircMessage}) { debugPrint('CLEARCHAT'); // If there is no message, it means that entire chat was cleared. if (ircMessage.message == null) { // messages.clear(); - return messages; + return; } final bannedUser = ircMessage.message; @@ -75,12 +73,10 @@ class IRC { } } }); - - return messages; } // Applies the given CLEARMSG message to a list and returns the result. - static List CLEARMSG({required List messages, required IRCMessage ircMessage}) { + static void clearMsg({required List messages, required IRCMessage ircMessage}) { // final targetUser = ircMessage.tags['login']; final targetId = ircMessage.tags['target-msg-id']; @@ -91,25 +87,17 @@ class IRC { break; } } - - return messages; } - static List PRIVMSG({required List messages, required IRCMessage ircMessage}) { - messages.add(ircMessage); - return messages; - } - - static USERNOTICE({required List messages, required IRCMessage ircMessage}) { + static void userNotice({required List messages, required IRCMessage ircMessage}) { debugPrint('USERNOTICE'); } - static List addMessage({required List messages, required String userState, required String sentMessage}) { + static void addMessage({required List messages, required String userState, required String sentMessage}) { debugPrint('USERSTATE'); final userChatMessage = parse(userState); userChatMessage.message = sentMessage; messages.add(userChatMessage); - return messages; } } diff --git a/lib/stores/chat_store.dart b/lib/stores/chat_store.dart index cf7ca775..16c45cf1 100644 --- a/lib/stores/chat_store.dart +++ b/lib/stores/chat_store.dart @@ -20,8 +20,7 @@ abstract class _ChatStoreBase with Store { @readonly var _autoScroll = true; - @readonly - var _messages = []; + final messages = ObservableList(); final _assetToUrl = {}; @@ -46,9 +45,10 @@ abstract class _ChatStoreBase with Store { _ChatStoreBase({required this.auth, required this.channelName}) { channel.stream.listen( - (event) => handleWebsocketData(event.toString()), + (data) => _handleWebsocketData(data.toString()), onDone: () => debugPrint("DONE"), ); + final commands = [ 'CAP REQ :twitch.tv/tags twitch.tv/commands', 'CAP END', @@ -60,6 +60,7 @@ abstract class _ChatStoreBase with Store { for (final command in commands) { channel.sink.add(command); } + _scrollController.addListener(() { if (!_scrollController.position.atEdge && _scrollController.position.pixels < _scrollController.position.maxScrollExtent) { _autoScroll = false; @@ -94,25 +95,25 @@ abstract class _ChatStoreBase with Store { } } - void handleWebsocketData(String ircMessages) { - for (final message in ircMessages.substring(0, ircMessages.length - 2).split('\r\n')) { + void _handleWebsocketData(String data) { + for (final message in data.substring(0, data.length - 2).split('\r\n')) { // debugPrint(message); if (message.startsWith('@')) { final parsedIRCMessage = IRC.parse(message); switch (parsedIRCMessage.command) { case 'CLEARCHAT': - _messages = IRC.CLEARCHAT(messages: _messages, ircMessage: parsedIRCMessage); - return; + IRC.clearChat(messages: messages, ircMessage: parsedIRCMessage); + break; case 'CLEARMSG': - _messages = IRC.CLEARMSG(messages: _messages, ircMessage: parsedIRCMessage); - return; + IRC.clearMsg(messages: messages, ircMessage: parsedIRCMessage); + break; case 'GLOBALUSERSTATE': // Updates the current global user state data (it includes user-id) globalUserState = message; return; case 'PRIVMSG': - _messages = IRC.PRIVMSG(messages: _messages, ircMessage: parsedIRCMessage); + messages.add(parsedIRCMessage); break; case 'ROOMSTATE': roomState = message; @@ -132,9 +133,10 @@ abstract class _ChatStoreBase with Store { } } if (_autoScroll) { - if (_messages.length > 200) { - _messages.removeRange(0, _messages.length - 180); + if (messages.length > 200) { + messages.removeRange(0, messages.length - 180); } + SchedulerBinding.instance?.addPostFrameCallback((_) { if (_scrollController.hasClients) { _scrollController.jumpTo(_scrollController.position.maxScrollExtent); @@ -146,6 +148,7 @@ abstract class _ChatStoreBase with Store { Widget renderChatMessage(IRCMessage ircMessage) { final result = []; + // TODO: These shouldn't be added to the global dict. Make it local (only this user/message will have the emotes) final emoteTags = ircMessage.tags['emotes']; if (emoteTags != null) { final emotes = emoteTags.split('/'); @@ -236,7 +239,7 @@ abstract class _ChatStoreBase with Store { if (ircMessage.command == 'CLEARCHAT' || ircMessage.command == 'CLEARMSG') { final banDuration = ircMessage.tags['ban-duration']; return Padding( - padding: const EdgeInsets.symmetric(vertical: 5.0), + padding: const EdgeInsets.symmetric(vertical: 8.0), child: Opacity( opacity: 0.50, child: Column( @@ -251,7 +254,7 @@ abstract class _ChatStoreBase with Store { ? const Text('Message deleted.') : const Text('Permanently Banned.') : Text( - 'Timed out for $banDuration seconds.', + 'Timed out for $banDuration second(s).', style: const TextStyle(fontWeight: FontWeight.bold), ) ], @@ -273,7 +276,7 @@ abstract class _ChatStoreBase with Store { _channel.sink.add('PRIVMSG #$channelName :$message'); - _messages = IRC.addMessage(messages: _messages, userState: userState!, sentMessage: message); + IRC.addMessage(messages: messages, userState: userState!, sentMessage: message); _textController.clear(); } diff --git a/lib/stores/chat_store.g.dart b/lib/stores/chat_store.g.dart index 2bc80d74..27812d5b 100644 --- a/lib/stores/chat_store.g.dart +++ b/lib/stores/chat_store.g.dart @@ -26,23 +26,6 @@ mixin _$ChatStore on _ChatStoreBase, Store { }); } - final _$_messagesAtom = Atom(name: '_ChatStoreBase._messages'); - - List get messages { - _$_messagesAtom.reportRead(); - return super._messages; - } - - @override - List get _messages => messages; - - @override - set _messages(List value) { - _$_messagesAtom.reportWrite(value, super._messages, () { - super._messages = value; - }); - } - final _$_ChatStoreBaseActionController = ActionController(name: '_ChatStoreBase');