Användarupplevelsen

Deltagarna på Microsoft Tech Days kan be om hjälp från en expert genom att trycka på en av fyra fysiska knappar - en var för Azure, Windows, Office och Security. Vill man ha utvecklarhjälp så trycker man en gång på respektive knapp, vill man ha hjälp av ett IT Pro dubbelklickar man.

När man har gjort det dyker ens förfrågan upp på en skärm bredvid knapparna så att man kan följa dess status. När en expert är på väg för att hjälpa till så uppdateras statusen med en uppskattning på hur många minuter det kommer att ta experten att komma fram. Avslutningsvis så kommer experten och hjälper till med att lösa problem och svara på frågor. Sedan lever alla lyckliga i alla sina dagar.

Ask Me status på expertförfrågningar

Informationsflödet

De knappar som används är från Flic och när någon klickar på en knapp så skickas en signal via Microsoft Flow till en .NET-applikation. Denna applikation har en lista på tillgängliga experter för varje område och skickar ut ett SMS till alla relevanta experter med hjälp av 46elks SMS-API. Experterna kan sedan svara på detta SMS genom att skicka tillbaka ett SMS där de anger om de kan komma eller inte. Svars-SMSet skickas via 46elks till .NET-applikationen.

Den expert som svarar först blir tilldelad ärendet och alla experter som svarade får en statusuppdatering via SMS om de fick ärendet eller inte. .NET-applikationen visar status på ärendet för användaren via en enkel web view.

Informationsflöde

Knapptryckning via Microsoft Flow

Det tacksamma med att använda Flic-knappar är att de har en färdig Microsoft Flow connector, vilket gör det enkelt att automatisera vad som händer när någon trycker på en knapp. Flics knappar har tre olika typer av händelser - enkelklick, dubbelklick och att hålla knappen intryckt. Enkel- och dubbelklick är konfigurerade i Microsoft Flow så att Flow gör ett anrop till .NET-applikationens API.

Microsoft Flow för Ask Me

Kolla bilden!

.NET-applikationen koordinerar

Som spindel i nätet sitter en .NET-applikation. Microsoft Flow skickar ett POST-anrop till denna applikations API. Anropet innehåller information om vilken typ av expert som efterfrågas (Azure, Security etc). Appen lagrar sedan denna request i sin databas, tar fram en lista på experter för det givna ämnet och skickar SMS till dessa via 46elks API. Det är också denna applikation som visar status på en förfrågan för användaren så att den som behöver hjälp kan se att en expert har blivit tillfrågad och kommer att vara på plats om X minuter.

[HttpPost]
public async void Post(string topic)
{
    // adding new request - make sure it's in the opened state
    var request = new Request()
    {
        State = RequestState.Opened,
        CreatedAt = DateTime.UtcNow,
        Topic = topic.ToUpper(), 
        ResolvedAt = null,
        Name = null,
        ArrivesInMinutes = null
    };

    using (var db = new TD2017ExpertsContext())
    {
        db.Requests.Add(request);
        db.SaveChanges();

        // let's lookup all the experts that knows about this topic
        var experts = db.Experts.Where(e => e.Topics.Contains(request.Topic));
        if (!experts.Any())
        {
            // no expert available
            MarkRequestFailed(db, request, "No expert available.");
            return;
        }
        else
        {
            bool overallSuccess = false;

            foreach (var expert in experts)
            {
                var success = await SmsHelper.SendSmsRequest(expert.PhoneNo, request.Topic, request.Id);
                if (success)
                    overallSuccess = true;
            }

            if (!overallSuccess)
                MarkRequestFailed(db, request, "Couldn't reach any experts");
            else
                MarkRequestQuerying(db, request);
        }
    }
}

SMS-kommunikation med 46elks

.NET-appen skickar SMS till experterna och tar emot deras SMS-svar, allt via 46elks SMS-API. För att göra detta krävs ett 46elks-konto med ett mobiltelefonnummer. Det är från detta nummer alla SMS skickas (kallas senderPhoneNo i koden nedan). Allt som krävs för att skicka ett SMS är ett användarnamn och lösenord för 46elks-kontot och att sedan POST:a avsändare (from), mottagare (to) och texten i SMSet (message) till api.46elks.com:

private static async Task<bool> SendSms(string phoneNo, string message)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("https://api.46elks.com");
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
            "Basic",
            Convert.ToBase64String(
                System.Text.ASCIIEncoding.ASCII.GetBytes(
                    string.Format("{0}:{1}", user, password))));

        var content = new FormUrlEncodedContent(new[] {
                new KeyValuePair<string, string> ("from", senderPhoneNo),
                new KeyValuePair<string, string> ("to", phoneNo),
                new KeyValuePair<string, string> ("message", message),
            });

        HttpResponseMessage response = await client.PostAsync("/a1/SMS", content);
        return response.IsSuccessStatusCode;
    }
}

Experten kan svara på en förfrågan genom att helt enkelt svara på SMSet. Detta går till det telefonnummer som är kopplat till ett 46elks-konto. Microsoft har hos 46elks angivit en callback-URL för detta nummer, en URL till .NET-applikationen. När expertens svars-SMS kommer in så gör 46elks en POST till denna callback-URL. Med i denna POST är texten som experten skrivit i sitt SMS samt lite meta-data om vem som skickade SMSet. .NET-applikationen tar emot denna POST och läser innehållet i SMSet.

[Produces("application/x-www-form-urlencoded")]
[Route("api/SmsCallback")]
public class SmsCallbackController : Controller
{
        [HttpPost]
        public async void HandleSms(SmsInfo sms)
        {
            var smsInfo = SmsHelper.ParseSms(sms);
            ...

Sammanfattning

Tryck på en knapp och få hjälp är en bra användarupplevelse. Implementationen av denna användarupplevelse är ett bra exempel på vad man kan göra med de byggklossar som idag finns tillgängliga för utvecklare. Det är inte mycket kod som behöver skrivas för att få till väldigt mycket funktionalitet. Den mesta komplexiteten i hela flödet hanteras av andra (Flic, Microsoft och 46elks). Allt apputvecklaren behöver göra är att pussla ihop delarna och ta till sig allt beröm.

Kom igång med 46elks API med denna guide hur man skickar SMS med C# eller någon av de andra guiderna.