Skip to content
This repository was archived by the owner on Apr 15, 2021. It is now read-only.

Commit 0c5e50c

Browse files
committed
Initial implementation for stickers
1 parent 36b8336 commit 0c5e50c

14 files changed

+434
-21
lines changed

src/Tel.Egram.Components.Messenger/Explorer/MessageModelFactory.cs

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ public MessageModel CreateMessage(Message message)
2020
case TdApi.MessageContent.MessagePhoto messagePhoto:
2121
return CreatePhotoMessage(message, messagePhoto);
2222

23-
// case TdApi.MessageContent.MessageSticker messageSticker:
24-
// return CreateStickerMessage(message, messageSticker);
23+
case TdApi.MessageContent.MessageSticker messageSticker:
24+
return CreateStickerMessage(message, messageSticker);
2525

26-
// case TdApi.MessageContent.MessageVideo messageVideo:
27-
// return CreateVideoMessage(message, messageVideo);
26+
case TdApi.MessageContent.MessageVideo messageVideo:
27+
return CreateVideoMessage(message, messageVideo);
2828

2929
default:
3030
return CreateUnsupportedMessage(message);
@@ -70,7 +70,7 @@ private PhotoMessageModel CreatePhotoMessage(
7070
{
7171
AuthorName = authorName,
7272
Message = message,
73-
Photo = photo,
73+
PhotoData = photo,
7474
Text = text
7575
};
7676
}
@@ -79,14 +79,44 @@ private StickerMessageModel CreateStickerMessage(
7979
Message message,
8080
TdApi.MessageContent.MessageSticker messageSticker)
8181
{
82-
throw new System.NotImplementedException();
82+
var user = message.User;
83+
var chat = message.Chat;
84+
85+
var authorName = (user == null)
86+
? chat.Title
87+
: $"{user.FirstName} {user.LastName}";
88+
89+
var sticker = messageSticker.Sticker;
90+
91+
return new StickerMessageModel
92+
{
93+
AuthorName = authorName,
94+
Message = message,
95+
StickerData = sticker
96+
};
8397
}
8498

8599
private VideoMessageModel CreateVideoMessage(
86100
Message message,
87101
TdApi.MessageContent.MessageVideo messageVideo)
88102
{
89-
throw new System.NotImplementedException();
103+
var user = message.User;
104+
var chat = message.Chat;
105+
106+
var authorName = (user == null)
107+
? chat.Title
108+
: $"{user.FirstName} {user.LastName}";
109+
110+
var text = messageVideo.Caption.Text;
111+
var video = messageVideo.Video;
112+
113+
return new VideoMessageModel
114+
{
115+
AuthorName = authorName,
116+
Message = message,
117+
VideoData = video,
118+
Text = text
119+
};
90120
}
91121

92122
private MessageModel CreateUnsupportedMessage(Message message)

src/Tel.Egram.Components.Messenger/Explorer/Messages/PhotoMessageModel.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55

66
namespace Tel.Egram.Components.Messenger.Explorer.Messages
77
{
8-
public class PhotoMessageModel : MessageModel, ISupportsActivation
8+
public class PhotoMessageModel : PreviewableMessageModel, ISupportsActivation
99
{
1010
public string Text { get; set; }
1111

12-
public Preview Preview { get; set; }
13-
14-
public TdApi.Photo Photo { get; set; }
12+
public TdApi.Photo PhotoData { get; set; }
1513

1614
public PhotoMessageModel()
1715
{

src/Tel.Egram.Components.Messenger/Explorer/Messages/PreviewLoadingLogic.cs

Lines changed: 108 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,22 @@ public static IDisposable BindPreviewLoading(
1515
model,
1616
Locator.Current.GetService<IPreviewLoader>());
1717
}
18+
19+
public static IDisposable BindPreviewLoading(
20+
this VideoMessageModel model)
21+
{
22+
return BindPreviewLoading(
23+
model,
24+
Locator.Current.GetService<IPreviewLoader>());
25+
}
26+
27+
public static IDisposable BindPreviewLoading(
28+
this StickerMessageModel model)
29+
{
30+
return BindPreviewLoading(
31+
model,
32+
Locator.Current.GetService<IPreviewLoader>());
33+
}
1834

1935
public static IDisposable BindPreviewLoading(
2036
this PhotoMessageModel model,
@@ -36,28 +52,115 @@ public static IDisposable BindPreviewLoading(
3652

3753
return Disposable.Empty;
3854
}
55+
56+
public static IDisposable BindPreviewLoading(
57+
this VideoMessageModel model,
58+
IPreviewLoader previewLoader)
59+
{
60+
if (model.Preview == null)
61+
{
62+
model.Preview = GetPreview(previewLoader, model);
63+
64+
if (model.Preview == null || model.Preview.Bitmap == null)
65+
{
66+
return LoadPreview(previewLoader, model)
67+
.Subscribe(preview =>
68+
{
69+
model.Preview = preview;
70+
});
71+
}
72+
}
73+
74+
return Disposable.Empty;
75+
}
76+
77+
public static IDisposable BindPreviewLoading(
78+
this StickerMessageModel model,
79+
IPreviewLoader previewLoader)
80+
{
81+
if (model.Preview == null)
82+
{
83+
model.Preview = GetPreview(previewLoader, model);
84+
85+
if (model.Preview == null || model.Preview.Bitmap == null)
86+
{
87+
return LoadPreview(previewLoader, model)
88+
.Subscribe(preview =>
89+
{
90+
model.Preview = preview;
91+
});
92+
}
93+
}
94+
95+
return Disposable.Empty;
96+
}
3997

4098
private static Preview GetPreview(IPreviewLoader previewLoader, PhotoMessageModel model)
4199
{
42-
if (model.Photo != null)
100+
if (model.PhotoData != null)
43101
{
44-
return previewLoader.GetPreview(model.Photo, PreviewQuality.High);
102+
return previewLoader.GetPreview(model.PhotoData, PreviewQuality.High);
45103
}
46104

47105
return null;
48106
}
49107

50108
private static IObservable<Preview> LoadPreview(IPreviewLoader previewLoader, PhotoMessageModel model)
51109
{
52-
if (model.Photo != null)
110+
if (model.PhotoData != null)
53111
{
54-
return previewLoader.LoadPreview(model.Photo, PreviewQuality.Low)
55-
.Concat(previewLoader.LoadPreview(model.Photo, PreviewQuality.High));
112+
return previewLoader.LoadPreview(model.PhotoData, PreviewQuality.Low)
113+
.Concat(previewLoader.LoadPreview(model.PhotoData, PreviewQuality.High));
56114
}
57115

58116
return Observable.Empty<Preview>();
59117
}
60118

119+
private static Preview GetPreview(IPreviewLoader previewLoader, VideoMessageModel model)
120+
{
121+
if (model.VideoData?.Thumbnail != null)
122+
{
123+
return previewLoader.GetPreview(model.VideoData.Thumbnail);
124+
}
125+
126+
return null;
127+
}
128+
129+
private static IObservable<Preview> LoadPreview(IPreviewLoader previewLoader, VideoMessageModel model)
130+
{
131+
if (model.VideoData?.Thumbnail != null)
132+
{
133+
return previewLoader.LoadPreview(model.VideoData.Thumbnail);
134+
}
135+
136+
return Observable.Empty<Preview>();
137+
}
138+
139+
private static Preview GetPreview(IPreviewLoader previewLoader, StickerMessageModel model)
140+
{
141+
if (model.StickerData?.Thumbnail != null)
142+
{
143+
return previewLoader.GetPreview(model.StickerData.Thumbnail);
144+
}
145+
146+
return null;
147+
}
148+
149+
private static IObservable<Preview> LoadPreview(IPreviewLoader previewLoader, StickerMessageModel model)
150+
{
151+
if (model.StickerData != null)
152+
{
153+
if (model.StickerData?.Thumbnail != null)
154+
{
155+
return previewLoader.LoadPreview(model.StickerData.Thumbnail)
156+
.Concat(previewLoader.LoadPreview(model.StickerData));
157+
}
158+
159+
return previewLoader.LoadPreview(model.StickerData);
160+
}
161+
162+
return Observable.Empty<Preview>();
163+
}
61164

62165
}
63166
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using TdLib;
2+
using Tel.Egram.Graphics.Previews;
3+
4+
namespace Tel.Egram.Components.Messenger.Explorer.Messages
5+
{
6+
public class PreviewableMessageModel : MessageModel
7+
{
8+
public Preview Preview { get; set; }
9+
}
10+
}

src/Tel.Egram.Components.Messenger/Explorer/Messages/StickerMessageModel.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
using System.Reactive.Disposables;
22
using ReactiveUI;
3+
using TdLib;
34

45
namespace Tel.Egram.Components.Messenger.Explorer.Messages
56
{
6-
public class StickerMessageModel : MessageModel, ISupportsActivation
7+
public class StickerMessageModel : PreviewableMessageModel, ISupportsActivation
78
{
8-
public string Text { get; set; }
9+
public TdApi.Sticker StickerData { get; set; }
910

1011
public StickerMessageModel()
1112
{
1213
this.WhenActivated(disposables =>
1314
{
1415
this.BindAvatarLoading()
1516
.DisposeWith(disposables);
17+
18+
this.BindPreviewLoading()
19+
.DisposeWith(disposables);
1620
});
1721
}
1822

src/Tel.Egram.Components.Messenger/Explorer/Messages/VideoMessageModel.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
using System.Reactive.Disposables;
22
using ReactiveUI;
3+
using TdLib;
34

45
namespace Tel.Egram.Components.Messenger.Explorer.Messages
56
{
6-
public class VideoMessageModel : MessageModel, ISupportsActivation
7+
public class VideoMessageModel : PreviewableMessageModel, ISupportsActivation
78
{
89
public string Text { get; set; }
910

11+
public TdApi.Video VideoData { get; set; }
12+
1013
public VideoMessageModel()
1114
{
1215
this.WhenActivated(disposables =>
1316
{
1417
this.BindAvatarLoading()
1518
.DisposeWith(disposables);
19+
20+
this.BindPreviewLoading()
21+
.DisposeWith(disposables);
1622
});
1723
}
1824

src/Tel.Egram.Graphics/Previews/IPreviewLoader.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,13 @@ public interface IPreviewLoader
88
Preview GetPreview(TdApi.Photo photo, PreviewQuality quality);
99

1010
IObservable<Preview> LoadPreview(TdApi.Photo photo, PreviewQuality quality);
11+
12+
Preview GetPreview(TdApi.PhotoSize photoSize);
13+
14+
IObservable<Preview> LoadPreview(TdApi.PhotoSize photoSize);
15+
16+
Preview GetPreview(TdApi.Sticker sticker);
17+
18+
IObservable<Preview> LoadPreview(TdApi.Sticker sticker);
1119
}
1220
}

src/Tel.Egram.Graphics/Previews/PreviewLoader.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,52 @@ public IObservable<Preview> LoadPreview(
6666
});
6767
}
6868

69+
public Preview GetPreview(TdApi.PhotoSize photoSize)
70+
{
71+
var file = photoSize?.Photo;
72+
73+
return new Preview
74+
{
75+
Bitmap = GetBitmap(file),
76+
Quality = PreviewQuality.High
77+
};
78+
}
79+
80+
public IObservable<Preview> LoadPreview(TdApi.PhotoSize photoSize)
81+
{
82+
var file = photoSize?.Photo;
83+
84+
return LoadBitmap(file)
85+
.Select(bitmap => new Preview
86+
{
87+
Bitmap = bitmap,
88+
Quality = PreviewQuality.High
89+
});
90+
}
91+
92+
public Preview GetPreview(TdApi.Sticker sticker)
93+
{
94+
var file = sticker.Sticker_;
95+
96+
return new Preview
97+
{
98+
Bitmap = GetBitmap(file),
99+
Quality = PreviewQuality.High
100+
};
101+
}
102+
103+
public IObservable<Preview> LoadPreview(TdApi.Sticker sticker)
104+
{
105+
var file = sticker.Sticker_;
106+
107+
return LoadBitmap(file)
108+
.Select(bitmap => new Preview
109+
{
110+
Bitmap = bitmap,
111+
Quality = PreviewQuality.High
112+
});
113+
}
114+
69115
private IObservable<IBitmap> LoadBitmap(TdApi.File file)
70116
{
71117
if (file != null)

src/Tel.Egram.Gui/Views/Messenger/Explorer/ExplorerControl.xaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@
3131
<messages:PhotoMessageControl />
3232
</DataTemplate>
3333

34+
<DataTemplate DataType="{x:Type model:VideoMessageModel}">
35+
<messages:VideoMessageControl />
36+
</DataTemplate>
37+
38+
<DataTemplate DataType="{x:Type model:StickerMessageModel}">
39+
<messages:StickerMessageControl />
40+
</DataTemplate>
41+
3442
<DataTemplate DataType="{x:Type model:UnsupportedMessageModel}">
3543
<messages:UnsupportedMessageControl />
3644
</DataTemplate>

src/Tel.Egram.Gui/Views/Messenger/Explorer/Messages/PhotoMessageControl.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@
6363
DataContext="{Binding Preview}">
6464

6565
<Image
66-
Width="300"
67-
Height="300"
66+
MaxHeight="300"
67+
Stretch="Uniform"
6868
Source="{Binding Bitmap}" />
6969

7070
</Border>

0 commit comments

Comments
 (0)