Archived
1
0
Related Work Items: #183, #185
This commit is contained in:
Michael Gordeev
2018-12-30 12:43:58 +03:00
parent 4958b092a4
commit 475a8947e6
4 changed files with 216 additions and 4 deletions
+59
View File
@@ -0,0 +1,59 @@
<UserControl
x:Class="FoxTube.Controls.Chat"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="600"
d:DesignWidth="400">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid Name="inputField">
<TextBox Margin="5,5,42,5" PlaceholderText="Send a message" Name="newMessage" VerticalAlignment="Center" MinHeight="32" TextWrapping="Wrap" AcceptsReturn="True"/>
<Button HorizontalAlignment="Right" Name="send" Click="send_Click" VerticalAlignment="Top"
Height="32" Width="32"
Margin="0,5,5,0" Padding="0"
Background="Transparent"
FontFamily="Segoe MDL2 Assets"
Content="&#xE122;" FontSize="30"/>
</Grid>
<ScrollViewer Grid.Row="1">
<ListView Name="list" SelectionMode="None">
<ListView.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Red" BorderThickness="{Binding Path=BorderThickness}" CornerRadius="5" HorizontalAlignment="Stretch" Background="{Binding Path=Background}" Margin="0,2">
<Grid Margin="0,5,5,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="5,0">
<FontIcon Glyph="&#xEC61;" ToolTipService.ToolTip="Verified" Margin="2,0" Visibility="{Binding Path=IsVerified}"/>
<FontIcon Glyph="&#xEC1B;" ToolTipService.ToolTip="Moderator" Margin="2,0" Visibility="{Binding Path=IsModerator}"/>
<FontIcon Glyph="&#xECA7;" ToolTipService.ToolTip="Chat owner" Margin="2,0" Visibility="{Binding Path=IsOwner}"/>
<FontIcon Glyph="&#xE735;" ToolTipService.ToolTip="Sponsor" Margin="2,0" Visibility="{Binding Path=IsSponsor}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Grid.Column="1" VerticalAlignment="Top" Margin="0,0,5,0">
<HyperlinkButton Content="{Binding Path=Author}" Tag="{Binding Path=ChannelId}" Grid.Column="1" Margin="0,-6,0,0" FontWeight="Bold" Click="HyperlinkButton_Click"/>
<TextBlock Text=":"/>
</StackPanel>
<TextBlock Grid.Column="2" IsTextSelectionEnabled="True" VerticalAlignment="Top" TextWrapping="WrapWholeWords" Text="{Binding Path=Message}"/>
</Grid>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
<ListViewItem>
<TextBlock Text="Welcome to the chat room" Foreground="Gray"/>
</ListViewItem>
</ListView>
</ScrollViewer>
</Grid>
</UserControl>
+143
View File
@@ -0,0 +1,143 @@
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using Google.Apis.YouTube.v3.Data;
using Google.Apis.YouTube.v3;
using Windows.UI;
namespace FoxTube.Controls
{
public class ChatMessage
{
public string Author
{
get { return message.AuthorDetails.DisplayName; }
}
public string Message
{
get { return message.Snippet.DisplayMessage; }
}
public string ChannelId
{
get { return message.AuthorDetails.ChannelId; }
}
public Visibility IsVerified
{
get { return message.AuthorDetails.IsVerified.Value? Visibility.Visible : Visibility.Collapsed; }
}
public Visibility IsOwner
{
get { return message.AuthorDetails.IsChatOwner.Value ? Visibility.Visible : Visibility.Collapsed; }
}
public Visibility IsSponsor
{
get { return message.AuthorDetails.IsChatSponsor.Value ? Visibility.Visible : Visibility.Collapsed; }
}
public Visibility IsModerator
{
get { return message.AuthorDetails.IsChatModerator.Value ? Visibility.Visible : Visibility.Collapsed; }
}
public Brush Background
{
get
{
if (IsVerified == Visibility.Visible || IsOwner == Visibility.Visible || IsSponsor == Visibility.Visible || IsModerator == Visibility.Visible)
return new SolidColorBrush() { Color = Colors.Red, Opacity = .2 };
else
return new SolidColorBrush();
}
}
public Thickness BorderThickness
{
get
{
if (IsVerified == Visibility.Visible || IsOwner == Visibility.Visible || IsSponsor == Visibility.Visible || IsModerator == Visibility.Visible)
return new Thickness(2);
else
return new Thickness(0);
}
}
private LiveChatMessage message;
public ChatMessage(LiveChatMessage item)
{
message = item;
}
}
public sealed partial class Chat : UserControl
{
string chatId;
DateTime lastInsert;
DispatcherTimer timer = new DispatcherTimer()
{
Interval = TimeSpan.FromSeconds(1)
};
public Chat(string id)
{
InitializeComponent();
if (!SecretsVault.IsAuthorized)
inputField.Visibility = Visibility.Collapsed;
chatId = id;
timer.Tick += Update;
timer.Start();
}
public async void Update(object sender, object e)
{
LiveChatMessagesResource.ListRequest request = SecretsVault.Service.LiveChatMessages.List(chatId, "snippet,authorDetails");
LiveChatMessageListResponse response = await request.ExecuteAsync();
foreach (LiveChatMessage i in response.Items)
if(i.Snippet.PublishedAt >= lastInsert)
list.Items.Insert(0, new ChatMessage(i));
lastInsert = DateTime.Now;
timer.Interval = TimeSpan.FromMilliseconds(response.PollingIntervalMillis.Value);
timer.Start();
}
private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
{
Methods.MainPage.GoToChannel(((HyperlinkButton)sender).Tag as string);
}
private async void send_Click(object sender, RoutedEventArgs e)
{
try
{
newMessage.IsEnabled = false;
send.IsEnabled = false;
if (string.IsNullOrWhiteSpace(newMessage.Text))
return;
LiveChatMessage message = new LiveChatMessage()
{
Snippet = new LiveChatMessageSnippet()
{
Type = "textMessageEvent",
LiveChatId = chatId,
TextMessageDetails = new LiveChatTextMessageDetails()
{
MessageText = newMessage.Text
}
}
};
LiveChatMessagesResource.InsertRequest request = SecretsVault.Service.LiveChatMessages.Insert(message, "snippet");
await request.ExecuteAsync();
}
finally
{
newMessage.Text = string.Empty;
newMessage.IsEnabled = true;
send.IsEnabled = true;
}
}
}
}
+6
View File
@@ -73,6 +73,12 @@ namespace FoxTube
catch { return null; }
}
public string GetPlaylist()
{
try { return (videoPlaceholder.Content as VideoPage).playlistId; }
catch { return null; }
}
public void SetTitleBar()
{
var titleBar = ApplicationView.GetForCurrentView().TitleBar;
+8 -4
View File
@@ -46,7 +46,7 @@ namespace FoxTube.Pages
ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;
public string videoId;
string playlistId = null;
public string playlistId = null;
public Video item;
bool wide;
@@ -267,9 +267,13 @@ namespace FoxTube.Pages
liveTimer.Start();
LiveStatsUpdate();
commentsPlaceholder.Header = "Chat";
//TODO: Initialize chat
//TODO: Initialize player
if(string.IsNullOrWhiteSpace(item.LiveStreamingDetails.ActiveLiveChatId))
pivot.Items.Remove(commentsPlaceholder);
else
{
commentsPlaceholder.Header = "Chat";
commentsPlaceholder.Content = new Chat(item.LiveStreamingDetails.ActiveLiveChatId);
}
download.Visibility = Visibility.Collapsed;
}