Refactor IRC functions & tweak padding
This commit is contained in:
parent
7a490f1ae7
commit
58041d4126
3 changed files with 23 additions and 49 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue