Integrating a Bot with Slack Events API - Live Coding Happy Hour for 2017-07-14

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
and we will at this point is actually since we're already live on two things it's less of a thing right so okay we should theoretically be alive on YouTube welcome everybody to live coding happy hour for whatever the heck dated July 14th 2017 I am Dave Slusher I'm a developer evangelist with ServiceNow in the platform business unit and with me we're preserving his voice because he he's got a sick and we're we may have a finite amount of it and he's the main driver today is my partner Josh Nereus also a developer evangelist in the same team as me saying business unit etc etc welcome Josh thank you Dave and thank you for preserving my voice we will see how this goes this is gonna be interesting yeah this and I actually don't I don't I don't and probably nobody minds if you uh you are I'll do a little less a little less talking than would be typical in what we do in this thing so let us get right to it let's do a little bit of background we kind of back up every now and then this is the first time that we're doing the three-way multiplexing with restream so we have been doing this on YouTube for about a year now I have to look up the exact day so so we've been doing this for about a year it's the first time we've done an actual live coding happy hour on twitch we've done some experiments but we haven't actually done the show yet and also first time we've done it on live edu TV so what we do is on Friday afternoons tube the other two the new two sites this is what everyone does so his less of a novelty to you guys but we get together we close our week out by turning the screen share on we start coding we do some ServiceNow coding which is our jobs and we just sort of a let it rip we pick up we don't do any kind of demo type material here what we're doing is actually picking a problem we're really legitimately working on and then we just turn the screen on and share it and at the same time we're drinking beer and to seg into that I'm drinking a fine line and kugel cranberry ginger Shandy actually sounds really good yeah it's uh I had I was a little bit worried it's one that I've been rearranging my office which is as I told Judge seven-mile disaster when I realized about 11:30 this morning that my beer fridge is often has been off for two days and so I had to put this in the freezer to get it drinkable and it and it wasn't even in the free fridge it was kind of sitting out who knows when it how long it's been sitting out but it's drinkable still so good and what are you drinking Josh so I have today dayquil severe hmm I have I have some tea and just because you know I had to feel like I was opening a can i I got I have some Lacroix sparkling water and that is what I'm drinking today unfortunately no beer because I think that would probably interact very badly with other stuff Josh is on the injured reserve he's uh coming in off the bench all right okay anything else uh that we need to talk about before we get right to it I'm gonna do my best I literally am provisioning a 1+5 that I just got so it's gonna be so hard to actually pay attention for the next 50 minutes but the one also might get up the second week stop streaming I'm hit getting in the car and going to a water park so I am completely I'm wearing a swimsuit right now it's extremely weird version of when our first show on Twitch in live edu it's an extremely weird show so let us get to it tell us what we're gonna be doing this week Josh yeah so this week we're actually billed slack integration and it's actually so I've done some things with slack integrations in the past and you can call the slack API you can do web hooks into slack that kind of thing but one of the things that we have talked about over in the s in depth channel numerous times is building some kind of a slack bot and so today we're actually going to build a slack bot and in in particular we're gonna build a slack bot that tracks points so there's a plus plus bot that's currently in you so furnace and nose and you type in somebody's name and plus plus and it gives them a point and it keeps track of it but you know as everybody from s in devs knows that thing has not been stable it's not been working correctly and I think it was Jase and probably a few people actually mention this over in that channel like hey why don't we just bill the slack but and agreed service now but servers now do all that so that's what we're gonna attempt to do today we're gonna try to build a slack bot we're gonna look at things like the events API and slack and and also calling some of the other API is to actually post messages to a slack channel and and we're also gonna actually really do it in the SN devs LC HH slack Channel today so you know thinks things might get a little fun I don't do you remember what the sign up Earl is for that is it SN devs dot right I think it's snow slack dot Heroku comet so SN o WS L ACK let me just check this so that was okay somebody's yeah in case somebody's wants to join that which it does exist so actually it's not there maybe it's calm tell you why yeah I thought it was SN dosed at whatever it was yeah so actually here's what it is so if you just go to SN devs comm yeah there's a link out there to snow select Roku app comm so okay great that's the easiest way putting your email address to getting and by great place to chat with other ServiceNow developers and so if you're following along and you're not there that's where we'll be alright you want to hit the share button that is what I will do so let's go ahead and right click there we go share screen share the correct screen hopefully and turn off the video and how's that looking it looks great okay see your slack yeah deal so we're over else ehh so I'm gonna work today in my employee instance and I'm doing this one of the things that we potentially need to do is actually find a more permanent place for this because if we're you know hosting a slack bot we need this thing to be up and running so we're gonna use an internal instance for this I'm gonna start in my employ instance and then we might push this somewhere else when we actually get it working to actually build stuff in slack it's pretty easy to get started so if we go to I think it's app slack com or is it uh that's what it is no that's not it let's just go to slack calm and we will select the ServiceNow team oh so that's actually where we already were so we go to apps and integrations and this is gonna open up the UI where you can actually install existing apps but in this case we actually want to build one so we can go to build and start building i haven't actually decided what we should call this thing Oh naming things is the back of the show let's just call it points thing point thing it's good with me let me look at the look at the chest right quick just to see if anybody has a oh just to throw out not that we have any kind of dearth of ideas because just to open the kimono for a minute we have so many ideas we don't get to but like if we have a thing that could integrate all three chats into a mega chat that would be a thing oh man it may exist at night but I don't know I don't know if there's a thing that already does that but to not have to have monitor three things would be pretty sweet actually that would be because if you can't the fact that we're integrating with that's a fourth different jet for today's show so yeah so let's see so we've got a couple of things that we need to look at so when you actually first build your app you can select what kinds of functionality it's got and so we actually need a bot and we also need events so let's take a look at the bots first so I had a bot user and it actually just handily enough calls that points thing right off the bat I'm gonna just tell this to show the bot is always online you can actually decide whether or not you want the bot just to always show up as being online and then let's take a look at event subscriptions so what happens the slack when you want to get real-time information has this events API and what this does is it allows you to subscribe to certain things as they happen so for example if I look at let's see what these various events are we can see things like a channel was created a channel was deleted archived etc so we want is a think message I am so a message was posted no it's in a direct message channel message channels so a message was posted to a channel so this is what we actually want to subscribe to and so as you can see there's a lot of stuff you can subscribe to you but in this case we actually just want to watch messages as they come through now you might be thinking this sounds an awful lot like Web books and it kind of does you know when we we've talked about web books before and this is not exactly the same I mean it's it's very similar in concept you know basically what's gonna happen is anytime this event happens slack is going to post information about the event to some end point and we're actually gonna create that end point but slack has a different thing called web hooks and it's not this so their thing is called event subscriptions but it's just worth noting because if this sounds like web hooks looks like web books it actually kind of is but it's just not what slack chose to call it so the next thing is we actually need to send this data somewhere and so we need to send this data to some kind of service so we don't actually have that service yet so that's actually what we have to do now is actually build it so let me go back to my instance and we'll just fire up studio and the massive list of things that I have in here and we'll create slack points thing [Laughter] anytime said that here's that thing that just part of our process we should maybe think about the name ahead of times we're creating new applications I have never once done it but it might be a thing you should put that on our punch list that's probably not a bad idea yeah cuz I don't know who will regret this or not we'll see so we need a script addressed API and so create one of those and we'll say slack event I guess handle slack events and naming things is hard and then we need a resource this resource is gonna be a post and we'll just call this handle see I already called the API handles like events I just call it handle event I just don't like that but that's fine so the the SN dev slack channel is not normally getting this much screen time so hopefully these guys don't go too crazy usually they're kind of in the background but they're actually front and center in the stream quite frequently today so yeah it's gonna be all over the place so don't say anything you don't want everybody to see I probably shouldn't have said that so I don't think we have any creepers we also need to turn off with indication so I'll do that and what we can do now it's just to make sure this thing works so click explore REST API this brings up the REST API Explorer here's my thing the whole URL and if I go and I paste this on the slack side you'll see it's probably not going to work so your URL did not respond with the value of the challenge parameter so what this is doing so the thing that slack does is there's this challenge process let me go to challenge request here we go so it's this URL verification handshake so they don't just let you put any URL they make sure that your API or whatever that you are is actually and truly set up to handle this so they send this token this challenge this type as as their initial request and then we're actually expected to respond with the value challenge in the body so that's something that we're gonna have to do so that's I guess the next thing is we'll go back here and we'll say so if it's gonna be request that body dot data and this is gonna represent let's just look at that again just got token a challenge so request up body that data dot challenge so if this thing exists and we actually want to respond with it and because we just need to set the entire body we actually need to take control of the response so we're gonna say response dot so we've got a question from the chat forgive me I'm paying attention many things so I will my attention is more fragmented this week than usual the we have a question what's the request format for the API so the the request format yeah from slacks coming in Jason so this is the actual thing that they're going to send us this is an example payload simple JSON object with three properties and so because of that we're able to do this you know scripted REST API is automatically automatically will parse that payload so it's actually going to come back we can just say dot challenge we don't have to do any of the parsing ourselves yeah if you weren't watching last week I last week's show had the little tip where I figured out how to get data out of non something where it does not set the content type to either application jason or application XML so it's actually thing I made a blog post this week about it so it's uh if you're I didn't really didn't realize this until last week is that if your incoming type isn't application JSON or application XML does it makes sense that it won't automatically do that Marshall that request body data won't exist unless it knows for a fact that your JSON or XML it's kind of even though the situation that situation that I was running in is where the payload was XML but the application type was like text plain or someone like that and so once I made it except that it actually body data stops working because basically your ServiceNow instance says I can't verify what this is so it doesn't know what to do with it so I got it and I can make sense yeah that makes sense one of the things I also want to call attention to is when you do response there's this thing called set body and I've never actually gotten that to work I'm not even sure why it's there or if it's even a real thing but this appears to be the correct thing to do so you get the stream wire the stream writer and then you write a string directly to the response and this seems to be the correct way to do that so if if you've ever run into that you're trying to do a set body check out this thing instead so in theory you test this you want to test this by firing up REST API Explorer or do you want just go straight for the thing you know let's let's test it first I want to actually see so we should be able to say let's send a raw Jason thing and so we'll say challenge and so in theory the response should just be one two three four five so call that and the response is 1 2 3 or 4 5 so we're good cool so now we can go back here and we can which window here it is will retry it okay so it's verified so we actually have a verified endpoint now it's responding to the challenge and we're actually getting stuff so that's good so the next thing we want to do is we well so if we look at our scripted REST API we're saying if the challenge is there but then there's gonna be this else so if if the challenge is not there we assume that this is just a normal message for now I'm just gonna do a GSN foe and I guess we'll say request a body dot data string how's that even though I'm not drinking beer I think dayquil is worse oh man so if I just like disappear and fall asleep even though it's supposed to be non-drowsy I don't think that's actually true so we'll try I guess what we actually need to do is we actually need to try generating real events and so to do that so we've got this thing registered but we actually have to get this slack bot into a room so if we go back here I guess the question is can we invite what do we call that it was just points thing here a valid team member name is required so I think we need to install this so even though it's not actually yeah here we go so we have to do install app to team and confirm your identity on ServiceNow a tab up with this username yep yep so good and authorize that do you have permission on select to do this um I appear to have permission on slack because that appears to you have worked and the real points thing is now in the LCH a channel I'm an invitation so what that should mean now is that because we've actually subscribed to messages and the bot is here I'm just go say hello points thing yeah I'll give that some party parrots too there we go and now what we need to do is we need to go back to my instance let's open up the logs and we'll wait and while we're waiting I'll get a sip of tea so we have log entries coming from the app but it's looking like this lack payload is empty so hmm let's take a look at that and you know I think the easiest thing is actually gonna be to fire up the debugger so why did that not clicking a breakpoint it's not setting Ric boy No there it is I think my instance is just really slow right now for some reason all right breakpoints set now we'll try hitting this from the rest API Explorer again and transaction pause the breakpoint and let's take a look so request you can't actually because it's a scriptable object it doesn't allow it doesn't appear to let me actually drill into it you know what I think is happening is I have noticed this before with script arrest api's where once you've actually read the body once you can't read it again or something like that let's you know let's try this Jason dot stringify request up body we'll generate another message we'll take a look at the logs again very slowly I was just so slow hello instance what's going on there we go okay so the payload is empty according to this so I mean we're definitely getting a request we're just not seeing oh this is why cuz body is not the thing data is the thing we want to string by we're gonna end up putting a lot of junk into the LC J's channel today so be it this actually might be a I might just have an inefficient query going on here because I'm filtering I would think that source would be an okay thing to filter on but it appears that that is part of the issue so okay there we go so we actually are getting a body or a payload so it's good and open this thing up it's just fire up Visual Studio code we'll take a look at it all right so we've got a couple of things coming through so there's a token that we're supposed to actually validate we're not gonna worry about that yet we can see have a team ID on the actual event so if you event type is message the user and this is interesting because I've noticed this with the Select API is the user that you actually see is so actually we'll try this if I take this user and if I come over into the Select channel and do at and then the actual the whole user name notice that it turns into my name which is weird but anyway so we've got the user we have the text so test three and everything else so at this point I think what probably makes sense is to start putting this into a table so we want to do some kind of processing on it but one of the things that in reading through some of the slack documentation they they highly recommend ingesting the data and then processing it so that you can reliably respond quickly to the event request from slack that's usually what you want to do so let's couldn't create table and I guess this we can call psych event that one's easy to name although I don't like Black Point slack event for those new to this that's kind of how scooping works right you've got you you've got a prefix that's just gonna come down and and sometimes your prefix just makes your table you sort of have to kind of get over that in the ServiceNow world cuz you don't really have a lot of control of that once you have fixed it for your application then everything is prefixed with it your your your scope is basically a name space and so you kind of have to live with that yeah and I mean that's one of the things that you sometimes want to try to think ahead as to what you want to call it so that you don't hate the name of everything that you have to create from that point forward which is sometimes easier the nun so all right so we've got our slack event table couldn't copy that and then over here instead of logging it we're gonna do I start talking a little bit less because my voice is actually starting to go away yeah I I'm doing a poor job of uh before you actually I'm absolutely do it well I'm not looking at the phone actually it's there the combination of live edu TV actually is having a little bit of problems I think we're maybe are exceeding the bitrate of what they can handle so yeah doing customer support thing oh geez all right there we go so we're gonna create a record we're gonna insert it all we're sitting sitting at this planes the payload so I'll try that and let's do some more stuff and we'll test the table so go to the psych Vince and there it is so we've got a payload you've got stuff coming in now the other thing we want to think about is okay so I just notice there's a question live chat so initialize our new record are the practical differences there are practical differences and those are that new record will apply default values whereas initialize well not so if there are default values or fields that could have default values you want to use new record in this case we don't have that we don't care so we are just using initialize so because this is a point spot we actually want to make sure that make sure we make sure that this thing has plus plus in it I don't know if that's ultimately the thing we want to do but if we want to basically make this thing behave like the existing bot that's probably what we should do so with that in mind what I'm gonna do is I'm gonna say if quest not body data let's look at this structure really quick data not event dot text data a die event text and I think contains as a thing and there are probably all sorts of weird things that we'll have to worry about here but we'll just start with this so at this point we're basically just saying that maybe doesn't contain it we're not even gonna store it we're just gonna throw it away because those are the only things we want we don't want to store every single message that ever happens that would just get ridiculous so let's try that we will say points n plus plus that way we're not giving I don't think the real point spots over here anyway but that's all right so look at that payload and actually let me put the created call them out here all right so we know which one we're actually looking at so there it is there's the text there is the user and again we see that it's actually turning that user name into the user ID so that could be interesting but at this point what we can do is we can start to track this so I guess the question is we should probably create I guess we should probably create a slack user table and then every time we actually see something for a particular user we'll go ahead and look up that user or create that user are we going to so that's coming in as the the user ID so slack is converting user name to sis ID basically or user you know grid and then using that when it's sending that back to you for the app mentioned right so yeah you have do you need to take back to your a pillow or one second after the one you were just looking at yeah the one that had that do you have that guy right there so there's nothing in so you're gonna need a separate call if you don't have you know u66 a four-level blah in your system you're gonna need to look that up right well potentially so here's the thing I think so again if I copy this and I and I paste this over here it's gonna just show up as the actual user so yeah it's automatically it's automatically referencing and dereferencing that thing for you yeah yeah it appears to be so so I think what that means is we can just store the ID it might be a nice enhancement to call the API to look up the user at some point but I think for at least our our first go around we can just store the value or just store the ID so there are a couple ways I guess we could think about this I guess what probably makes the most sense is just to say that guess like user there we go like user slack point slack user I already don't like it is ready that's just gonna be a string and then points let's give me an integer and so what we want to do well so I guess here's what we want to do is I should probably at some point put this into business rule or put this in a script include but I'm gonna just throw a business rule on the slack event table for now and we'll say process points it's gonna be on slack event and we'll run this on insert only I won't run this advanced we're gonna run this asynchronously and what we actually have to do is look this thing up so let's say so we have to parse that payload and then we can say user ID this event Oh so hmm this is gonna get interesting because this thing we need to parse this out oh you have to figure out okay so you need a regular expression to get out solely so here's the deal you've got that thing in the text why is that different than the user up above it immediately up above it well so the user above is yeah yeah so all right let's pick up one of our let's pick up our favorite regular expression test jerks Ruby Leroy comm is one that I like but Ruby they're all right there we go so here's our test string and oh my goodness this is gonna this is gonna test on you all right left left bracket I think I can do this for you in one shot sorry I'm sorry left less than square bracket carrot right greater than square bracket right bracket yeah plus right angle bracket I'm not good at many things but I can write it down so this is actually just to tell you why I'm doing that this is I learned this in the Jeffrey Friedel book I think in my mastering regular expressions O'Reilly book that I read oh my I don't know 15 somewhere between 15 and 20 years ago and he was talking about backtracking and regular expressions and when you have ambiguity particularly so it's not gonna matter too much here but when you have really wrong long input strings you can you can actually kind of watch this sort of geometric for credit progression as you have so many different ways to pop to parse it but when you do something like this you're basically saying my character class I'm saying is not a right bracket so the first time you see an otter you see a right bracket that character class is done so there's no backtracking whatsoever so if you just dot star you could do that but then if you had a long string it would go to the end to see like what other possible it would start at the end and then it would backtrack to find the minimal search potentially so so this way I almost never write a wild-card I always just say if we're going until we see a right bracket then we're just gonna say our character classes everything is not a right bracket that makes sense yeah the whole like yeah the look behind stuff is weird to me but then again I think regular expressions are weird to most people I'm one of the few people that really enjoys them I will admit that I'm weird so now what we have to do is I have to remember how to actually call it in JavaScript it's called let's see what's it finish yeah I think it's matched JavaScript let's uh let's open this up so we actually have to extract the string yeah I think it is not match so let's just do this we will put let's go and get our actual payload yeah there it is so so here's a question is let's see we actually want what's you wide yeah I think you want element so you're should be getting I to get the match and I believe he's you're gonna get an array it's not sure yeah so capture capture the value and I think what you want is what you actually want so in your regular expression right put parentheses oh I just want to capture yep yep yep and I think you want element one of the what did I miss I think I've got an extra thing there now it's no go back to Ruby there you see what your parentheses around the character class not not inside oh and yeah and around the plus on the far side of the plus there you go okay that makes sense yeah that right there is what you want now we're talking yep so like you said we want element 1 and there it is cool so we can now say event dot text now let's go back and pull out this regular expression this event that text right yep enter text dot match 1 now the one area that this is gonna fail and I'm just gonna go with this for now but there is a possibility that the thing where Plus plussing is not a user and so this could fail so we'll have to handle that at some point but I'm just gonna go with this for now what happens if you yeah I see what you're saying so if you just plus plus like arbitrary text it will just be arbitrary text and it won't have that bracketed format yeah so like this we tried that there and let's look at the payload we get hmm oh let's sort this correctly there we go looking at the wrong thing so yeah it's just gonna be that however what if the text you sorted was bracket something bracket huh yeah so we might have to deal with a little bit of nonsense there but again that's kind of an edge case well we can yeah well that's the thing we have to do later but right now not a priority day so we'll do G our user points plus plus and then we'll update it and then if that doesn't work we'll say initialize user ID equals user ID and we'll start with one point there we go save it um so let's do this ceremonial first funny assist I also gave me a slack notification when nice nice now the real question is did you actually get points we don't know yet but we'll find out so let's go into slack whoops slack users looks like not oh no Dave didn't get points so let me see if I had to bet it's probably not liking something up here let's just make sure this thing is running when we think it is is running on insert so that's good it's running on the slack event table let's do this let's actually run this thing after which then means we can attach to it and I'm gonna take this payload will go to REST API Explorer and let's try this out well well I need to actually set a breakpoint so let's do that so here we go we'll step through there is the event object and we've got there's our event that seemed to actually die right away so it definitely didn't like this um so let's go you know look at the log to see yeah yeah that's a good point let's do that just see what it was complaining on as it died we'll wait for my speedy syslog to come up at line 12 undefined value so the match is so oh whoa it wasn't what we thought that's pretty weird well we're also getting at line one okay but no yeah that should be in here did I actually call that thing points let's take a look at the user yeah it's called points user ID did I do something weird with Jer slack user if oh no thanks thanks Andrew I appreciate it [Laughter] let's see that's a maybe doesn't like the plus plus can't imagine why it wouldn't but then again it is a glide it's gonna be an object or something at that point so Tariq is asking why can't you just dot walk in that object to get the user though yes yeah okay yeah actually go for it cuz I'm gonna drink some tea the so what we've got here is not it's not like a sis user that we can you know that's built in there's a reference type that is that user is the text that came in from that payload so it's not a naught dot walkable it's not a it's not a thing that our system knows about yeah exactly so yeah that's what we're that's why we've got to parse it that is they put another way that's not sis user that's like arbitrary slack we're Oh sis ID thing that it actually do something this time where's my breakpoint too many transactions pop oh this is this thing still pause okay that's why I just need to let that thing go that's why let's go back here let's run this again now I can do that yeah it's still immediately dying right here so are we not maybe what we're doing is not so let's go back to your scripts background oh wait a second just what the huh so let's just went down here I don't know that just did oh oh this is actually an I stepped into the rest resource that's why so yeah so let's go back do we hit let's make sure that we have the make sure that we have the identical rug acts I copied it before so we should yeah but let's paste so I'm gonna try running this again without without trying to extract the first element or the second element technically and see if there's something I don't know it's going on that's weird the bugger it does not like it is to event dot text what you think it is that's a good question let's try that next because we're saying event is current not payload so let us actually I believe it is because we tried that a minute ago let me get this again back to the bugger and here's the event object so let's go into it so there's oh hang on oh that's why because there's an event inside so so actually I've probably called this something that's not really what we should be calling it I should be calling this the payload there we go I think that's going to take care of it to run that I still have a paused breakpoint let's run that again step over [Music] now we're getting what we want and there's user ID so I think this is actually gonna work so let's just let this go I'm gonna go ahead and close out the debugger yeah and let's look at the table there we go so user ID now has two points fan tastic and so and so we're doing this the interesting thing is that your instance now actually doesn't have doesn't like it it can keep track of these things without actually knowing who any of those people are mm-hmm yep and then so the next step and what we would do although I don't think we should probably start trying to do this because when we have about seven minutes left is to respond and and at that point there's a different API so there's a Web API that allows us to actually talk to the channel and so what we would do is take that data from here so as you know as part of the final step we've inserted this and then we've got the object and then we would actually post a message back to the channel with this user ID now has X number of points I'm just going true I'm just goofing around because I want to go let's open this up in a second now let's go back to that so interestingly enough what let's do one thing you know because of the nature of how we're doing this we're only gonna if you did two in one line you're only gonna get the first one right mm yeah you're probably yeah yeah that's because of the Reg the ridge is only gonna get one thing so go back to your instance that let's see we should have a several people now yeah we do cool so I was collecting them and yeah it's working cool all right so do you want to is there anything else you want to do now do you want to hold up right there you know I think this is probably a good place to pause because the next you know the next thing is is basically dealing with an entirely different kind of integration and so it probably makes sense to come back to that in a future life coding session so okay all right so I think so we had a two-thirds success rate in this experiment the live edu TV didn't work great I think our bitrate maybe was set too high I'm not sure what we have in OBS we may have to crank that down twitch seems to work just fine and YouTube seem to work just fine let me see if we have any last minute questions no I don't think so so we've got we've got a lot of activity in the slack Channel bunch of goofiness happening so yeah I think that seems that seems good to me yeah yeah I think so so let me go ahead and shut off sharing and turn the camera back on turn mine back on I have mostly resisted playing with my phone I will not say that I have 100% resisted I may have added my left thumb to the fingerprint sensor while we were on the line of kugel cranberry ginger Shandy solid for part of that is contextual because it's exactly what I'm in the mood for right the second how's your day quell and dayquil is helping the teas actually for being you know more of a medicinal tea that's supposed to help you your throat feel better is actually not bad it actually is kind of tasty which is a weird thing to say about it but it's okay and alright so there you have it there's a live coding happy hour for this week we're gonna stop a couple minutes early and Josh is gonna go back to bed and I'm gonna go to a waterpark like a plan all right and we will catch you all again I think we're gonna do it next week we've been kind of there have been a lot of weeks that have we've had some issue in another I think we'll be around next week so should be so see you next time everybody see ya
Info
Channel: ServiceNow Dev Program
Views: 17,956
Rating: 4.7837839 out of 5
Keywords: servicenow, live coding happy hour, lchh, slack, slack bot, events api
Id: bSAhw7TukuU
Channel Id: undefined
Length: 57min 18sec (3438 seconds)
Published: Fri Jul 14 2017
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.