Skip to content

Commit

Permalink
almost have chat send message working
Browse files Browse the repository at this point in the history
  • Loading branch information
dmmulroy committed Mar 18, 2024
1 parent 0aa6a67 commit 81c826d
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 1 deletion.
15 changes: 15 additions & 0 deletions src/glitch.gleam
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ import dot_env/env
import pprint
import glitch/api/client.{Options}
import glitch/api/user.{GetUsersRequest}
import glitch/api/chat.{SendMessageRequest}

const user_id = "209286766"

pub fn main() {
use client_id <- result.try(env.get("CLIENT_ID"))
Expand All @@ -16,6 +19,18 @@ pub fn main() {

let result = user.get_users(client, get_users_request)

pprint.debug(result)

let send_message_request =
SendMessageRequest(
broadcaster_id: user_id,
sender_id: user_id,
message: "Hello from Glitch and Gleam!",
reply_parent_message_id: None,
)

let result = chat.send_message(client, send_message_request)

pprint.debug(result)
Ok(Nil)
}
72 changes: 72 additions & 0 deletions src/glitch/api/chat.gleam
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import gleam/dynamic.{type Decoder}
import gleam/option.{type Option}
import gleam/result
import gleam/json.{type DecodeError, type Json}
import gleam/http/response.{type Response}
import gleam/http/request
import glitch/api/client.{type Client}
import glitch/extended/json_ext
import glitch/api/api_response

pub type Message {
Message(message_id: String, is_sent: Bool)
}

fn message_decoder() -> Decoder(Message) {
dynamic.decode2(
Message,
dynamic.field("message_id", dynamic.string),
dynamic.field("is_sent", dynamic.bool),
)
}

pub fn message_from_json(json_string: String) -> Result(Message, DecodeError) {
json.decode(json_string, message_decoder())
}

pub type SendMessageRequest {
SendMessageRequest(
broadcaster_id: String,
sender_id: String,
message: String,
reply_parent_message_id: Option(String),
)
}

fn send_message_request_to_json(request: SendMessageRequest) -> Json {
json.object([
#("broadcaster_id", json.string(request.broadcaster_id)),
#("sender_id", json.string(request.sender_id)),
#("message", json.string(request.message)),
#(
"reply_parent_message_id",
json_ext.option(request.reply_parent_message_id, json.string),
),
])
}

pub type SendMessageError {
DecodeError(DecodeError)
RequestError
}

pub fn send_message(
client: Client,
request: SendMessageRequest,
) -> Result(Response(List(Message)), SendMessageError) {
let request =
request.new()
|> request.set_body(send_message_request_to_json(request))
|> request.set_path("chat/messages")

use response <- result.try(
client
|> client.post(request)
|> result.replace_error(RequestError),
)

response
|> response.try_map(api_response.from_json(_, of: message_decoder()))
|> result.try(api_response.get_data_from_response)
|> result.map_error(DecodeError)
}
16 changes: 15 additions & 1 deletion src/glitch/api/client.gleam
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import gleam/dynamic.{type Dynamic}
import gleam/list
import gleam/pair
import gleam/http.{type Header, Get}
import gleam/http.{type Header, Get, Post}
import gleam/http/request.{type Request, Request}
import gleam/http/response.{type Response}
import gleam/httpc
Expand Down Expand Up @@ -61,3 +61,17 @@ pub fn get(
|> api_request.from_request
|> httpc.send
}

pub fn post(
client: Client,
request: Request(Json),
) -> Result(Response(String), Dynamic) {
let headers =
client
|> headers
|> merge_headers(request.headers)

Request(..request, method: Post, headers: headers)
|> api_request.from_request
|> httpc.send
}

0 comments on commit 81c826d

Please sign in to comment.