harn-modules 0.7.30

Cross-file module graph and import resolution utilities for Harn
Documentation
import { filter_nil } from "std/collections"
import { merge } from "std/json"
import { wait_for } from "std/monitors"

var slack_connector_config = {}

pub fn configure(config) {
  slack_connector_config = filter_nil(config ?? {})
  return slack_connector_config
}

pub fn reset() {
  slack_connector_config = {}
}

fn __call(method, params = {}) {
  return connector_call("slack", method, filter_nil(merge(slack_connector_config, params ?? {})))
}

pub fn post_message(channel, text, blocks = nil, options = nil) {
  return __call("post_message", filter_nil(options ?? {} + {channel: channel, text: text, blocks: blocks}))
}

pub fn update_message(channel, ts, text, blocks = nil, options = nil) {
  return __call(
    "update_message",
    filter_nil(options ?? {} + {channel: channel, ts: ts, text: text, blocks: blocks}),
  )
}

pub fn add_reaction(channel, ts, name, options = nil) {
  return __call("add_reaction", options ?? {} + {channel: channel, ts: ts, name: name})
}

pub fn open_view(trigger_id, view, options = nil) {
  return __call("open_view", options ?? {} + {trigger_id: trigger_id, view: view})
}

pub fn user_info(user_id, options = nil) {
  return __call("user_info", options ?? {} + {user_id: user_id})
}

pub fn api_call(method, args = nil, options = nil) {
  return __call("api_call", filter_nil(options ?? {} + {method: method, args: args ?? {}}))
}

pub fn upload_file(filename, content, options = nil) {
  return __call("upload_file", options ?? {} + {filename: filename, content: content})
}

fn __slack_event(log_event) {
  return log_event?.payload?.event
}

fn __slack_payload(log_event) {
  return __slack_event(log_event)?.provider_payload
}

fn __slack_channel_matches(payload, channel) {
  return channel == nil || payload?.channel == channel || payload?.channel_id == channel
}

fn __slack_user_matches(payload, user) {
  return user == nil || payload?.user == user || payload?.user_id == user
}

fn __slack_text_matches(payload, text) {
  return text == nil || contains(payload?.text ?? "", text)
}

/** message_source. */
pub fn message_source(channel = nil, options = nil) {
  return {
    label: "slack.message:" + to_string(channel ?? "*"),
    prefers_push: true,
    poll: { ctx ->
    let payload = __slack_payload(ctx?.last_push_event)
    return {
    matched: payload != nil,
    message: payload,
    channel: payload?.channel ?? payload?.channel_id,
    user: payload?.user ?? payload?.user_id,
    text: payload?.text,
    ts: payload?.ts,
    thread_ts: payload?.thread_ts,
  }
  },
    push_filter: { log_event ->
    let event = __slack_event(log_event)
    let payload = __slack_payload(log_event)
    return event?.provider == "slack"
    && (event?.kind == "message" || event?.kind == "app_mention"
    || starts_with(event?.kind ?? "", "message."))
    && __slack_channel_matches(payload, channel)
    && __slack_user_matches(payload, options?.user)
    && (options?.thread_ts == nil || payload?.thread_ts == options.thread_ts)
    && __slack_text_matches(payload, options?.text_contains)
  },
  }
}

/** reaction_source. */
pub fn reaction_source(channel = nil, reaction = nil, options = nil) {
  return {
    label: "slack.reaction:" + to_string(channel ?? "*") + ":" + to_string(reaction ?? "*"),
    prefers_push: true,
    poll: { ctx ->
    let payload = __slack_payload(ctx?.last_push_event)
    return {
    matched: payload != nil,
    reaction: payload?.reaction,
    item: payload?.item,
    item_user: payload?.item_user,
    event: payload,
  }
  },
    push_filter: { log_event ->
    let event = __slack_event(log_event)
    let payload = __slack_payload(log_event)
    return event?.provider == "slack"
    && event?.kind == "reaction_added"
    && (reaction == nil || payload?.reaction == reaction)
    && (channel == nil || payload?.item?.channel == channel || payload?.channel_id == channel)
    && __slack_user_matches(payload, options?.user)
  },
  }
}

/** wait_for_message. */
pub fn wait_for_message(channel = nil, options = nil) {
  return wait_for(
    merge(
    options ?? {},
    {source: message_source(channel, options), condition: { state -> state.matched }},
  ),
  )
}

/** wait_for_reaction. */
pub fn wait_for_reaction(channel = nil, reaction = nil, options = nil) {
  return wait_for(
    merge(
    options ?? {},
    {source: reaction_source(channel, reaction, options), condition: { state -> state.matched }},
  ),
  )
}