Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 41 additions & 8 deletions Alice.NET/Alice.NET.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,51 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AliceServiceConstants.cs" />
<Compile Include="Extensions\AliceExtensions.cs" />
<Compile Include="Models\Meta.cs" />
<Compile Include="Models\AliceResponse.cs" />
<Compile Include="Models\Button.cs" />
<Compile Include="Models\AliceRequest.cs" />
<Compile Include="Models\Request.cs" />
<Compile Include="Models\Response.cs" />
<Compile Include="Models\Session.cs" />
<Compile Include="Images\IImagesApi.cs" />
<Compile Include="Images\UploadedImage.cs" />
<Compile Include="Images\ImagesApi.cs" />
<Compile Include="JsonSerializer\IJsonSerializer.cs" />
<Compile Include="JsonSerializer\JsonSerializer.cs" />
<Compile Include="Models\Builders\BaseBuilder.cs" />
<Compile Include="Models\Builders\Buttons\IButtonBuilder.cs" />
<Compile Include="Models\Builders\Buttons\ITipButtonBuilder.cs" />
<Compile Include="Models\Builders\Buttons\TipButtonBuilder.cs" />
<Compile Include="Models\Builders\Cards\BigImageCardBuilder.cs" />
<Compile Include="Models\Builders\Cards\ImageCardBuilder.cs" />
<Compile Include="Models\Builders\Cards\FooterBuilder.cs" />
<Compile Include="Models\Builders\Cards\HeaderBuilder.cs" />
<Compile Include="Models\Builders\Cards\IImageCardBuilder.cs" />
<Compile Include="Models\Builders\Cards\IFooterBuilder.cs" />
<Compile Include="Models\Builders\Cards\IHeaderBuilder.cs" />
<Compile Include="Models\Builders\Cards\IItemsListCardBuilder.cs" />
<Compile Include="Models\Builders\Cards\ItemsListCardBuilder.cs" />
<Compile Include="Models\Builders\Common\AliceResponseBuilder.cs" />
<Compile Include="Models\Builders\Common\IAliceResponseBuilder.cs" />
<Compile Include="Models\Builders\IModelBuilder.cs" />
<Compile Include="Models\Builders\Responses\IResponseBuilder.cs" />
<Compile Include="Models\Cards\ImageCard.cs" />
<Compile Include="Models\Builders\Buttons\ButtonBuilder.cs" />
<Compile Include="Models\Cards\Card.cs" />
<Compile Include="Models\Enums\CardType.cs" />
<Compile Include="Models\Cards\Footer.cs" />
<Compile Include="Models\Cards\Header.cs" />
<Compile Include="Models\Buttons\TipButton.cs" />
<Compile Include="Models\Cards\ItemsListCard.cs" />
<Compile Include="Models\Requests\Markup.cs" />
<Compile Include="Models\Requests\Meta.cs" />
<Compile Include="Models\Enums\RequestType.cs" />
<Compile Include="Models\Responses\AliceResponse.cs" />
<Compile Include="Models\Buttons\Button.cs" />
<Compile Include="Models\Requests\AliceRequest.cs" />
<Compile Include="Models\Requests\Request.cs" />
<Compile Include="Models\Responses\Response.cs" />
<Compile Include="Models\Builders\Responses\ResponseBuilder.cs" />
<Compile Include="Models\Common\Session.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
2 changes: 2 additions & 0 deletions Alice.NET/AliceServiceConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@ public static class AliceServiceConstants
/// Версия протокола
/// </summary>
public const string ProtocolVersion = "1.0";
public const string ApiVersion = "v1";
internal const string ApiHost = "https://dialogs.yandex.net";
}
}
22 changes: 0 additions & 22 deletions Alice.NET/Extensions/AliceExtensions.cs

This file was deleted.

11 changes: 11 additions & 0 deletions Alice.NET/Images/IImagesApi.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Threading.Tasks;

namespace Alice.Images
{
public interface IImagesApi
{
Task<UploadedImage[]> TryGetUploadedImagesAsync();
Task<UploadedImage> TryUploadImageFromFileAsync(string filename);
Task<UploadedImage> TryUploadImageFromUrlAsync(string url);
}
}
65 changes: 65 additions & 0 deletions Alice.NET/Images/ImagesApi.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using Alice.JsonSerializer;

namespace Alice.Images
{
public class ImagesApi : IImagesApi
{
private readonly string _token;
private readonly string _apiUrl;
private readonly IJsonSerializer _jsonSerializer = new JsonSerializer.JsonSerializer(); //чёт не нравится такая интеграция зависимостей

private static readonly HttpClient Client = new HttpClient()
{
DefaultRequestHeaders = {{"Host", AliceServiceConstants.ApiHost } }
};

public ImagesApi(string skillId, string token)
{
_token = token;
_apiUrl = $"{AliceServiceConstants.ApiHost}/api/" +
$"{AliceServiceConstants.ApiVersion}/skills/{skillId}/images"; //куда-нибудь вынесем позже
}

private async Task<UploadedImage> TryUploadImage(HttpContent content)
{
content.Headers.Add("Authorization", $"OAuth {_token}");
var response = await Client.PostAsync(_apiUrl, content);
var responseString = await response.Content.ReadAsStringAsync();
var result = _jsonSerializer.Deserialize<UploadedImage>(responseString);
return result;
}

public async Task<UploadedImage> TryUploadImageFromUrlAsync(string url)
{
var uploadValues = new Dictionary<string, string>
{
{ "url", url }
};
var content = new FormUrlEncodedContent(uploadValues);
content.Headers.Add("Content-Type", "application/json");

return await TryUploadImage(content);
}

public async Task<UploadedImage> TryUploadImageFromFileAsync(string filename)
{
var imageBytes = File.ReadAllBytes(filename);
var content = new ByteArrayContent(imageBytes);
content.Headers.Add("Content-Type", "multipart/form-data");

return await TryUploadImage(content);
}

public async Task<UploadedImage[]> TryGetUploadedImagesAsync()
{
var response = await Client.GetAsync(_apiUrl);
var responseString = await response.Content.ReadAsStringAsync();
var result = _jsonSerializer.Deserialize<UploadedImage[]>(responseString);
return result;
}
}
}
19 changes: 19 additions & 0 deletions Alice.NET/Images/UploadedImage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Newtonsoft.Json;

namespace Alice.Images
{
public class UploadedImage
{
/// <summary>
/// Идентификатор изображения
/// </summary>
[JsonProperty("id")]
public string Id { get; set; }

/// <summary>
/// URL изображения
/// </summary>
[JsonProperty("origUrl")]
public string OriginalUrl { get; set; }
}
}
8 changes: 8 additions & 0 deletions Alice.NET/JsonSerializer/IJsonSerializer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Alice.JsonSerializer
{
public interface IJsonSerializer
{
string Serialize<TModel>(TModel model);
TModel Deserialize<TModel>(string json);
}
}
20 changes: 20 additions & 0 deletions Alice.NET/JsonSerializer/JsonSerializer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using Newtonsoft.Json;

namespace Alice.JsonSerializer
{
public class JsonSerializer : IJsonSerializer
{
private readonly JsonSerializerSettings _settings =
new JsonSerializerSettings() {NullValueHandling = NullValueHandling.Ignore};

public string Serialize<TModel>(TModel model)
{
return JsonConvert.SerializeObject(model, Formatting.None, _settings);
}

public TModel Deserialize<TModel>(string json)
{
return JsonConvert.DeserializeObject<TModel>(json);
}
}
}
11 changes: 11 additions & 0 deletions Alice.NET/Models/Builders/BaseBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Alice.Models.Builders
{
public class BaseBuilder<TModel> : IModelBuilder<TModel>
{
protected TModel BuildingModel;
public TModel Build()
{
return BuildingModel;
}
}
}
20 changes: 20 additions & 0 deletions Alice.NET/Models/Builders/Buttons/ButtonBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using Alice.Models.Buttons;

namespace Alice.Models.Builders.Buttons
{
public class ButtonBuilder<TButton> : BaseBuilder<TButton>, IButtonBuilder<TButton>
where TButton : Button, new()
{
public IButtonBuilder<TButton> Create(string title)
{
BuildingModel = new TButton() {Title = title};
return this;
}

public IButtonBuilder<TButton> WithUrl(string url)
{
BuildingModel.Url = url;
return this;
}
}
}
11 changes: 11 additions & 0 deletions Alice.NET/Models/Builders/Buttons/IButtonBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using Alice.Models.Buttons;

namespace Alice.Models.Builders.Buttons
{
public interface IButtonBuilder<out TButton> : IModelBuilder<TButton>
where TButton : Button, new()
{
IButtonBuilder<TButton> Create(string title);
IButtonBuilder<TButton> WithUrl(string url);
}
}
9 changes: 9 additions & 0 deletions Alice.NET/Models/Builders/Buttons/ITipButtonBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Alice.Models.Buttons;

namespace Alice.Models.Builders.Buttons
{
public interface ITipButtonBuilder : IButtonBuilder<TipButton>
{
ITipButtonBuilder Hide();
}
}
13 changes: 13 additions & 0 deletions Alice.NET/Models/Builders/Buttons/TipButtonBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Alice.Models.Buttons;

namespace Alice.Models.Builders.Buttons
{
public class TipButtonBuilder : ButtonBuilder<TipButton>, ITipButtonBuilder
{
public ITipButtonBuilder Hide()
{
BuildingModel.Hide = true;
return this;
}
}
}
20 changes: 20 additions & 0 deletions Alice.NET/Models/Builders/Cards/BigImageCardBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using Alice.Models.Cards;

namespace Alice.Models.Builders.Cards
{
public interface IBigImageCardBuilder : IImageCardBuilder
{ }

public class BigImageCardBuilder : ImageCardBuilder, IBigImageCardBuilder
{
public override IImageCardBuilder Create(string title, string imageId)
{
BuildingModel = new ImageCard(isBigImageCard: true)
{
Title = title,
ImageId = imageId
};
return this;
}
}
}
32 changes: 32 additions & 0 deletions Alice.NET/Models/Builders/Cards/FooterBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System;
using Alice.Models.Builders.Buttons;
using Alice.Models.Buttons;
using Alice.Models.Cards;

namespace Alice.Models.Builders.Cards
{
public class FooterBuilder : BaseBuilder<Footer>, IFooterBuilder
{
private readonly IButtonBuilder<Button> _defaultButtonBuilder;

public IFooterBuilder Create(string text)
{
BuildingModel = new Footer() {Text = text};
return this;
}

public IFooterBuilder WithButton(Button button)
{
BuildingModel.Button = button;
return this;
}

public IFooterBuilder WithButton(Func<IButtonBuilder<Button>, Button> buttonBuildFunc,
IButtonBuilder<Button> builder = null)
{
builder = builder ?? _defaultButtonBuilder;
BuildingModel.Button = buttonBuildFunc(builder);
return this;
}
}
}
16 changes: 16 additions & 0 deletions Alice.NET/Models/Builders/Cards/HeaderBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Alice.Models.Cards;

namespace Alice.Models.Builders.Cards
{
public class HeaderBuilder : BaseBuilder<Header>, IHeaderBuilder
{
public IHeaderBuilder Create(string text)
{
BuildingModel = new Header()
{
Text = text
};
return this;
}
}
}
15 changes: 15 additions & 0 deletions Alice.NET/Models/Builders/Cards/IFooterBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System;
using Alice.Models.Builders.Buttons;
using Alice.Models.Buttons;
using Alice.Models.Cards;

namespace Alice.Models.Builders.Cards
{
public interface IFooterBuilder : IModelBuilder<Footer>
{
IFooterBuilder Create(string text);
IFooterBuilder WithButton(Button button);
IFooterBuilder WithButton(Func<IButtonBuilder<Button>, Button> buttonBuildFunc,
IButtonBuilder<Button> builder = null);
}
}
Loading