Implement rendering of USERNOTICE messages
This commit is contained in:
parent
4af72b8da0
commit
eb3f0bc082
4 changed files with 54 additions and 32 deletions
|
|
@ -16,7 +16,7 @@ class IRC {
|
|||
final banDuration = ircMessage.tags['ban-duration'];
|
||||
|
||||
messages.asMap().forEach((i, message) {
|
||||
if (message.user! == bannedUser) {
|
||||
if (message.user == bannedUser) {
|
||||
messages[i].command = 'CLEARCHAT';
|
||||
|
||||
if (banDuration != null) {
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import 'package:frosty/models/channel.dart';
|
|||
|
||||
part 'channel_list_store.g.dart';
|
||||
|
||||
// TODO: Fix followed list refresh when log in.
|
||||
class ChannelListStore = _ChannelListBase with _$ChannelListStore;
|
||||
|
||||
abstract class _ChannelListBase with Store {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:frosty/api/bttv_api.dart';
|
||||
|
|
@ -112,7 +113,8 @@ abstract class _ChatStoreBase with Store {
|
|||
IRC.clearMsg(messages: messages, ircMessage: parsedIRCMessage);
|
||||
break;
|
||||
case 'GLOBALUSERSTATE':
|
||||
// Updates the current global user state data (it includes user-id)
|
||||
// Updates the current global user state data (it includes user-id),
|
||||
// Don't really see a use for it when USERSTATE exists, so leaving it unimplemented for now.
|
||||
// _globalUserState = message;
|
||||
break;
|
||||
case 'PRIVMSG':
|
||||
|
|
@ -123,7 +125,7 @@ abstract class _ChatStoreBase with Store {
|
|||
break;
|
||||
case 'USERNOTICE':
|
||||
debugPrint(message);
|
||||
// _messages = IRC.USERNOTICE(messages: _messages, ircMessage: parsedIRCMessage);
|
||||
messages.add(parsedIRCMessage);
|
||||
break;
|
||||
case 'USERSTATE':
|
||||
// Updates the current user-state data
|
||||
|
|
@ -182,7 +184,6 @@ abstract class _ChatStoreBase with Store {
|
|||
}
|
||||
}
|
||||
|
||||
final words = ircMessage.message!.split(' ');
|
||||
final badges = ircMessage.tags['badges'];
|
||||
if (badges != null) {
|
||||
for (final badge in badges.split(',')) {
|
||||
|
|
@ -218,31 +219,35 @@ abstract class _ChatStoreBase with Store {
|
|||
const TextSpan(text: ':'),
|
||||
);
|
||||
|
||||
for (final word in words) {
|
||||
final emoteUrl = _assetToUrl[word];
|
||||
if (emoteUrl != null) {
|
||||
result.add(const TextSpan(text: ' '));
|
||||
result.add(
|
||||
WidgetSpan(
|
||||
alignment: PlaceholderAlignment.middle,
|
||||
child: CachedNetworkImage(
|
||||
imageUrl: emoteUrl,
|
||||
placeholder: (context, url) => const SizedBox(),
|
||||
fadeInDuration: const Duration(seconds: 0),
|
||||
height: 25,
|
||||
final message = ircMessage.message;
|
||||
if (message != null) {
|
||||
final words = message.split(' ');
|
||||
for (final word in words) {
|
||||
final emoteUrl = _assetToUrl[word];
|
||||
if (emoteUrl != null) {
|
||||
result.add(const TextSpan(text: ' '));
|
||||
result.add(
|
||||
WidgetSpan(
|
||||
alignment: PlaceholderAlignment.middle,
|
||||
child: CachedNetworkImage(
|
||||
imageUrl: emoteUrl,
|
||||
placeholder: (context, url) => const SizedBox(),
|
||||
fadeInDuration: const Duration(seconds: 0),
|
||||
height: 25,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
result.add(const TextSpan(text: ' '));
|
||||
result.add(TextSpan(text: word));
|
||||
);
|
||||
} else {
|
||||
result.add(const TextSpan(text: ' '));
|
||||
result.add(TextSpan(text: word));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ircMessage.command == 'CLEARCHAT' || ircMessage.command == 'CLEARMSG') {
|
||||
final banDuration = ircMessage.tags['ban-duration'];
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
padding: const EdgeInsets.symmetric(vertical: 10.0),
|
||||
child: Opacity(
|
||||
opacity: 0.50,
|
||||
child: Column(
|
||||
|
|
@ -259,15 +264,34 @@ abstract class _ChatStoreBase with Store {
|
|||
: Text(
|
||||
'Timed out for $banDuration second(s).',
|
||||
style: const TextStyle(fontWeight: FontWeight.bold),
|
||||
)
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
} else if (ircMessage.command == 'USERNOTICE') {
|
||||
return Container(
|
||||
color: Colors.purple.withOpacity(0.25),
|
||||
padding: const EdgeInsets.symmetric(vertical: 10.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (ircMessage.message != null)
|
||||
ChatMessage(
|
||||
key: Key(ircMessage.tags['id']!),
|
||||
children: result,
|
||||
),
|
||||
Text(ircMessage.tags['system-msg']!),
|
||||
],
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return ChatMessage(
|
||||
key: ircMessage.tags['id'] == null ? null : Key(ircMessage.tags['id']!),
|
||||
children: result,
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 5.0),
|
||||
child: ChatMessage(
|
||||
key: ircMessage.tags['id'] == null ? null : Key(ircMessage.tags['id']!),
|
||||
children: result,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,12 +7,9 @@ class ChatMessage extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 5.0),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
children: children,
|
||||
),
|
||||
return RichText(
|
||||
text: TextSpan(
|
||||
children: children,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue