diff --git a/README.md b/README.md index 81c94ab..6b34acc 100644 --- a/README.md +++ b/README.md @@ -263,6 +263,34 @@ Sends an answer to an callback query sent from inline keyboards. show-alert) ``` + +## Q-Code + +Q-Codes in Morse are shorthands for common patterns. `morse.qcodes/direct-reply` & `morse.qcodes/req-morse` are the Q-Codes already available. Here is an example usage of both. + +```clojure +(ns look.anotherbadlynamedns + (:require [morse.qcodes :as q] + [morse.handlers :as h] + [somehttpserver :as http])) + +(def token "") +(def webhook "") + +(defn just-say-hi [name] + (str "Hi " name "!")) + +(defhandler thisismyapp + (message {:keys [text]} (just-say-hi text))) + +(def therealhandler (q/direct-reply token thisismyapp)) + +(morse.api/set-webhook token (str webhook "/" token)) ;; make webhooks safe by using the token as path +(def myserver (http/start-server (q/req->morse token therealhandler) {:port 80})) +;; req->morse will convert json to edn and make sure the proper path (token) is used. +``` + + ## License Copyright © 2017 Anton Chebotaev diff --git a/deps.edn b/deps.edn new file mode 100644 index 0000000..ef6e4b6 --- /dev/null +++ b/deps.edn @@ -0,0 +1,11 @@ +{:paths ["src"] + :deps {org.clojure/clojure {:mvn/version "1.9.0"} + org.clojure/tools.macro {:mvn/version "0.1.5"} + org.clojure/core.async {:mvn/version "0.4.474"} + org.clojure/tools.logging {:mvn/version "0.4.1"} + org.clojure/spec.alpha {:mvn/version "0.1.143"} + clj-stacktrace {:mvn/version "0.2.8"} + cheshire {:mvn/version "5.8.1"} + clj-http {:mvn/version "3.9.1"}} + :mvn/repos {"central" {:url "https://repo1.maven.org/maven2/"} + "clojars" {:url "https://repo.clojars.org/"}}} \ No newline at end of file diff --git a/project.clj b/project.clj index 5c4925a..a53b05f 100644 --- a/project.clj +++ b/project.clj @@ -3,10 +3,11 @@ :url "https://github.com/otann/morse/" - :dependencies [[org.clojure/clojure "1.8.0" :scope "provided"] + :dependencies [[org.clojure/clojure "1.9.0"] [org.clojure/tools.macro "0.1.5"] [org.clojure/core.async "0.4.474"] [org.clojure/tools.logging "0.4.1"] + [org.clojure/spec.alpha "0.1.143"] [clj-stacktrace "0.2.8"] [cheshire "5.8.1"] [clj-http "3.9.1"]] diff --git a/src/morse/api.clj b/src/morse/api.clj index e50ce05..792d9b4 100644 --- a/src/morse/api.clj +++ b/src/morse/api.clj @@ -1,11 +1,33 @@ (ns morse.api - (:require [clojure.tools.logging :as log] + (:require [clojure.spec.alpha :as s] + [clojure.tools.logging :as log] [clj-http.client :as http] [clojure.string :as string] [cheshire.core :as json] [clojure.core.async :as a]) (:import (java.io File))) +(s/def ::token + (s/and string? + (partial re-matches #"^\d{9}:.{35}"))) + +(s/def ::text string?) +(s/def ::chat-id int?) +(s/def ::parse-mode #{"Markdown" "HTML"}) +(s/def ::disable-webpage-preview boolean?) + +(s/def ::getMe nil?) +(s/def ::sendMessage + (s/keys :req [::chat-id ::text] + :opt [::parse-mode ::disable-webpage-preview])) + +(s/def ::method + #{(s/tuple "getMe" ::getMe) + (s/tuple "sendMessage" ::sendMessage)}) + +(s/def ::request + (s/keys :req [::token ::method])) + (def base-url "https://api.telegram.org/bot") diff --git a/src/morse/qcodes.clj b/src/morse/qcodes.clj new file mode 100644 index 0000000..31a9773 --- /dev/null +++ b/src/morse/qcodes.clj @@ -0,0 +1,23 @@ +(ns morse.qcodes + (:require [compojure.core :refer [make-route]] + [clojure.core.async :as a] + [ring.middleware.json :refer [wrap-json-response wrap-json-body]] + [morse.api :as api] + [morse.polling :as pol])) + +(defn- only [pred val] + (when (pred val) + val)) + +(defn req->morse [safe-url handler] + (make-route :post (str "/" safe-url) + (wrap-json-response + (wrap-json-body + (comp handler :body) + {:keywords? true :bigdecimals? true})))) + +(defn direct-reply [token handler] + (fn [{{{chatid :id} :chat} :message :as req}] + (when-let [reply (only string? (handler req))] + (api/send-text token chatid reply)) + {:status 200}))