0条留言

 显示圣诞礼物的照片

因此,至少可以说,由于大流行,今年的圣诞节很有趣。遵循COVID-19准则,今年我们可以交换我们的秘密圣诞老人礼物。只有一个问题。通常,我们会分配一些纸质彩票来分配秘密圣诞老人。我们倾向于在同一天晚上这样做。但是,随着COVID-19的开展,今年就有了FaceTime以及类似的活动。 FaceTime很棒,但在彩票方面却不是很好,尤其是因为没人知道谁是谁。

那么,在没有人知道选谁的情况下,成功完成《 Secret Santa 2021》该怎么办?为什么不自己做,爆发 Visual Studio程式码 并编写一个小应用程序来为我们做这件事。因此,我将该过程分为以下几个步骤:

  • 读取输入
  • 随机分配
  • 发送短信

免责声明: 使用Twilio没有得到任何补偿。我这样做是因为这似乎是一个有趣的项目,而SMS似乎是所有参与人员最友好的方法。

现在,为了阅读输入,我使用了或多或少的标准CSV文件格式,如下所示:

Person1;+15551234
Person2;+15551235

我认为这将带来一定的灵活性,并允许我共享代码而不共享任何私人联系信息。 ðŸ〜‰

Reading the input can be done with a few helpers 从 the .Net Framework living in the System and System.IO namespace.

type Person = {  名称  : string; MobileNumber : string }

let parseToPerson (inputString:string) =
    let csvItems = inputString.Split(";")
    {Name = csvItems.[0]; MobileNumber = csvItems.[1]}

现在,在分配秘密圣诞老人的算法旁边。在我们家里,规则很简单。每个人都是别人的秘密圣诞老人,没有人是他或她自己的秘密圣诞老人。可以通过对列表使用随机数进行排序,然后将其压缩为CSV文件的顺序来实现随机分配:

let random = Random()
let rec assignSecretSantas (people : Person seq) =
    let secretSantasAssignments =
        people
        |> Seq.sortBy(fun x -> random.Next())
    
    let assignments = 
        secretSantasAssignments
        |> Seq.zip people
        |> Seq.toList
    
    if assignments |> Seq.exists (fun a -> fst a = snd a) then
        assignSecretSantas people
    else
        assignments

最后,检查分配是否没有人分配给自己。如果存在非法分配,则该方法将递归执行。

现在到对我来说新的部分。通过代码发送短信。我听说过 特威里奥 之前,但从未有机会试用他们的服务。设置帐户是您的工厂运行创建帐户方案。他们甚至为您提供了几美元来试用他们的教程。因此,有了我的试用帐户和手头的钱,我实现了SMS部分。

第一步是添加 NuGet包 。开发此代码时,我使用了F#脚本文件。我为什么要提这件事,因为 F# 5 在脚本中添加/使用NuGet包就像在脚本文件顶部添加以下几行一样简单:

#r "nuget:  特威里奥 "

open  特威里奥 
open  特威里奥 .Rest.Api.V2010.Account

But in the final version, I opted for a console app, which uses the standard dotnet add package 特威里奥 to add the package to your project.

在能够发送消息之前,需要初始化客户端。

let initTwilio =
    let accountSid = configuration.GetSection(" 特威里奥 ").["Sid"]
    let authToken = configuration.GetSection(" 特威里奥 ").["AuthToken"]
     特威里奥 Client.Init(accountSid, authToken)

我必须说 docs 来自Twilio的帮助对您有很大帮助。如果您正在寻找更高级的方案,请务必将它们签出。

初始化客户端后,我编写了代码来发送消息:

let secretSantaPhoneNumber = "+15551236"
let secretSantaMessage = "Testmessage"
MessageResource.Create(
     特威里奥 .Types.PhoneNumber(secretSantaPhoneNumber), 
    body=secretSantaMessage, 
     从 =Twilio.Types.PhoneNumber(" 特威里奥 -Sender-Phone-Number"))

发送消息比最初预期的要复杂一些。相比之下,一切都与我在注册时必须提供的电话号码配合使用。当尝试向家庭中的其他人发送测试消息时,我收到了错误消息,以使用以前在Twilio的试用版中注册的号码。解决方法是使用付费帐户-但此后,我可以实施Secret Santas的发送:

let rec informSecretSantas dryRun (santas: (Person * Person) list) =
    match santas with
    | [] -> ()
    | head::tail ->
        let santaName = (fst head).Name
        let giftReceiver = (snd head).Name
        let phoneNumber = (fst head).MobileNumber
        let body = $"The secret santa message"
        if dryRun then
            printfn "%s" body
            printfn "Sending to %s" phoneNumber
        else
            let msg = MessageResource.Create(Twilio.Types.PhoneNumber(phoneNumber), body=body,  从 =Twilio.Types.PhoneNumber(" 特威里奥 -Phone-Number"))
            printfn "%A" msg.Status
        informSecretSantas dryRun tail

随着2021年圣诞节的到来,人们得到了拯救。现在这是最好的选择吗?嗯,那里有很多服务-有些甚至支持SMS,而且不需要花钱。但是其中之一会带来什么乐趣呢? 🙃

对我来说,使用F#脚本文件划分“应用程序”的不同部分的经验非常好,而且非常直观。在F#中运行代码 替换 / FSI 允许快速迭代和尝试。一个额外的好处是使用 离子化物 -使用VS Code开发F#时要安装的插件。 离子化物 刚刚进行了更新,以支持F#5.0。 🥳

哦,还有另一个建议,如果您按住按钮以执行FSI中的代码,它将运行多次。询问我的家人在第一次“测试”运行中收到一条秘密圣诞老人短信后收到了四个秘密短信后如何知道。 🙈

您可以在上找到整个代码 的GitHub .


标题照片作者: 露西·丽兹(Lucie Liz) 像素

发表评论