Refactor IRC functions & tweak padding

This commit is contained in:
tommyxchow 2021-10-20 05:12:15 -04:00
parent 7a490f1ae7
commit 58041d4126
3 changed files with 23 additions and 49 deletions

View file

@ -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<IRCMessage> CLEARCHAT({required List<IRCMessage> messages, required IRCMessage ircMessage}) {
static void clearChat({required List<IRCMessage> 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<IRCMessage> CLEARMSG({required List<IRCMessage> messages, required IRCMessage ircMessage}) {
static void clearMsg({required List<IRCMessage> 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<IRCMessage> PRIVMSG({required List<IRCMessage> messages, required IRCMessage ircMessage}) {
messages.add(ircMessage);
return messages;
}
static USERNOTICE({required List<IRCMessage> messages, required IRCMessage ircMessage}) {
static void userNotice({required List<IRCMessage> messages, required IRCMessage ircMessage}) {
debugPrint('USERNOTICE');
}
static List<IRCMessage> addMessage({required List<IRCMessage> messages, required String userState, required String sentMessage}) {
static void addMessage({required List<IRCMessage> messages, required String userState, required String sentMessage}) {
debugPrint('USERSTATE');
final userChatMessage = parse(userState);
userChatMessage.message = sentMessage;
messages.add(userChatMessage);
return messages;
}
}

View file

@ -20,8 +20,7 @@ abstract class _ChatStoreBase with Store {
@readonly
var _autoScroll = true;
@readonly
var _messages = <IRCMessage>[];
final messages = ObservableList<IRCMessage>();
final _assetToUrl = <String, String>{};
@ -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 = <InlineSpan>[];
// 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();
}

View file

@ -26,23 +26,6 @@ mixin _$ChatStore on _ChatStoreBase, Store {
});
}
final _$_messagesAtom = Atom(name: '_ChatStoreBase._messages');
List<IRCMessage> get messages {
_$_messagesAtom.reportRead();
return super._messages;
}
@override
List<IRCMessage> get _messages => messages;
@override
set _messages(List<IRCMessage> value) {
_$_messagesAtom.reportWrite(value, super._messages, () {
super._messages = value;
});
}
final _$_ChatStoreBaseActionController =
ActionController(name: '_ChatStoreBase');