Как стать контрибьютором Microsoft Bot Framework

Привет. Если вы уже были на моём блоге, то наверняка заметили мою любовь к Microsoft Bot Framework. Мне нравится эта технология, она удобная, легко используемая и имеет открытый исходный код. В этой статье я хочу рассказать, как можно внести вклад, хоть и не большой, в развитие данной технологии на личном опыте.

Для тех, кто не в курсе, Microsoft Bot Framework состоит из этих ключевых элементов:

  • Bot Builder SDK — предназначен для создания ключевой функциональности бота, сейчас доступен для C# и Node.js
  • Bot Connector — позволяет привязывать вашего бота к нескольким каналам общения (Telegram, Skype, Slack, Facebook messenger и др.)
  • Cognitive Services — алгоритмы AI упакованные в доступные API, которые позволяют производить анализ естественного языка, осуществлять поиск на изображениях и прочее.

Рассказать я хочу про расширение функционала Bot Builder SDK.

Чтобы понять какой функционал был добавлен лично мной, нужно вспомнить про возможности, дающие FormFlow (можете посмотреть краткое видео из курса,  либо почитать статью про локализацию FormFlow). Если кратко, то FormFlow позволяет генерировать диалог для заполнения данных на основании структуры класса. Например, если есть класс:

public class InterviewInfoModel
{
	public int Id;
	public string Name;

	[Numeric(18, 100)]
	public int Age = 18;

	public List<MessengerOptions> Messenger;

	[Optional]
	public LangOptions? Language;

	[Numeric(1, 10)]
	public int Grade = 6;

	public string Comments;
}

То FormFlow на основании этих данных создаст диалог вида:

Интерфейс созданного через FormFlow диалога можно легко настраивать, делая его очень полезным инструментом. Но в нём был один недостаток, когда нам нужно было убрать некоторые поля из заполнения, например, в данном случае, пользователи абсолютно не нужно заполнять идентификатор, то приходилось указывать список используемых полей, как здесь:

var form = new FormBuilder<InterviewInfoModel>()
.Field(nameof(InterviewInfoModel.Name))
.Field(nameof(InterviewInfoModel.Age))
.Field(nameof(InterviewInfoModel.Messenger))
.Field(nameof(InterviewInfoModel.Grade))
.Field(nameof(InterviewInfoModel.Language))
.Field(nameof(InterviewInfoModel.Comments))
.Build();

Что, согласитесь, не очень удобно когда нужно исключить 1-2 поля из нескольких десятков. Очень хотелось добавить возможность исключения полей каким-то более простым способом. Когда я выступал на митапе, ко мне подходили люди с этим же вопросом, спрашивая, как можно исключить некоторые поля из FormFlow не перечисляя все нужные. Ответ был — никак, если не городить свои "костыли".

Я решил, что почему бы самому не предложить реализацию возможности исключения указанных полей из FormFlow. Для начала я предложил новый issue (https://github.com/Microsoft/BotBuilder/issues/3845), с предложением добавления нового функционала

Затем занялся добавлением нового функционала в коде. Чтобы добавить новую возможность, я сделал fork для репозитория https://github.com/Microsoft/BotBuilder в нем добавил коммит, содержащий следующие правки:

В CSharp/Library/Microsoft.Bot.Builder/FormFlow/Attributes.cs я добавил новый кастомный атрибут IgnoreFieldAttribute

[Serializable]
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public class IgnoreFieldAttribute : Attribute
{
	/// <summary>
	/// Mark a field or property as excluded.
	/// </summary>
	public IgnoreFieldAttribute()
	{ }
}

Добавление данного атрибута к полю класса должно исключать его из формирования FormFlow Чтобы это работало, в классы FormBuilderJson.cs и FormBuilder.cs в метод FieldPaths добавил дополнительное условие при получении полей класса:

.Where(f => !f.IsDefined(typeof(IgnoreFieldAttribute)))

Теперь для класса, указанного выше, для исключения полей, можно написать как

[IgnoreField]
public int Id;

И поле Id не попадёт в формирование FormFlow

Сам коммит можно увидеть здесь https://github.com/Microsoft/BotBuilder/commit/1f144aa4a8bfc1e7fb4d4914bb95072406150a0f

Далее необходимо отправить добавленный коммит в Pull request в master ветку (https://github.com/Microsoft/BotBuilder/pull/3846). При отправке Pull request необходимо подписать «Contribution License Agreement», кому интересно, с текстом можно ознакомится здесь: https://cla.opensource.microsoft.com/Microsoft/BotBuilder После этого нужно ждать, пока ваши правки примут, либо отвергнут. Ждать, к слову, пришлось очень долго — отправил изменения я 29 ноября 2017, а влили их в master ветку только ночью 10 февраля 2018. Зато теперь мой небольшой вклад в Bot Builder, красуется в репозитории Microsoft:

Очень радует, что благодаря open source можно самостоятельно добавлять действительно нужный функционал в любимые инструменты. Немного печалит срок, который понадобился для включения отосланных правок в основную ветку, но в целом я доволен, надеюсь в следующую сборку в Nuget эти правки попадут и ими можно будет комфортно пользоваться…

Приятного программирования.

Добавить комментарий