{"id":20677834,"url":"https://github.com/clivern/racter","last_synced_at":"2025-06-23T15:32:50.728Z","repository":{"id":22282984,"uuid":"95885650","full_name":"Clivern/Racter","owner":"Clivern","description":":crocodile: A Java Framework for Building Bots on Facebook's Messenger Platform.","archived":false,"fork":false,"pushed_at":"2025-05-28T00:56:06.000Z","size":1269,"stargazers_count":21,"open_issues_count":5,"forks_count":11,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-23T14:52:57.068Z","etag":null,"topics":["chatbot","facebook-api","facebook-messenger-bot","java","java-library","messenger-bot","messenger-chat-bot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Clivern.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":null,"custom":"buymeacoffee.com/clivern"}},"created_at":"2017-06-30T12:17:58.000Z","updated_at":"2025-05-29T03:04:22.000Z","dependencies_parsed_at":"2023-02-10T12:16:22.232Z","dependency_job_id":"6dc34309-82fb-4097-8b5a-5e1012fc4ae3","html_url":"https://github.com/Clivern/Racter","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/Clivern/Racter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Clivern%2FRacter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Clivern%2FRacter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Clivern%2FRacter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Clivern%2FRacter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Clivern","download_url":"https://codeload.github.com/Clivern/Racter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Clivern%2FRacter/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261504552,"owners_count":23168860,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chatbot","facebook-api","facebook-messenger-bot","java","java-library","messenger-bot","messenger-chat-bot"],"created_at":"2024-11-16T21:17:16.969Z","updated_at":"2025-06-23T15:32:50.668Z","avatar_url":"https://github.com/Clivern.png","language":"Java","funding_links":["buymeacoffee.com/clivern"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg alt=\"Racter Logo\" src=\"https://raw.githubusercontent.com/Clivern/Racter/master/images/logo.png\" height=\"80\" /\u003e\n    \u003ch3 align=\"center\"\u003eRacter\u003c/h3\u003e\n    \u003cp align=\"center\"\u003eA Java Framework for Building Bots on Facebook's Messenger Platform.\u003c/p\u003e\n    \u003cp align=\"center\"\u003e\n        \u003ca href=\"http://www.javadoc.io/doc/com.clivern/racter\"\u003e\u003cimg src=\"http://www.javadoc.io/badge/com.clivern/racter.svg\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://travis-ci.org/Clivern/Racter\"\u003e\u003cimg src=\"https://travis-ci.org/Clivern/Racter.svg?branch=master\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://mvnrepository.com/artifact/com.clivern/racter/1.0.5\"\u003e\u003cimg src=\"https://img.shields.io/maven-central/v/com.clivern/racter.svg\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://github.com/Clivern/Racter/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/LICENSE-Apache_2.0-orange.svg\"\u003e\u003c/a\u003e\n    \u003c/p\u003e\n\u003c/p\u003e\n\n\n## Documentation\n\n### Installation\n\nTo add a dependency using Maven, use the following:\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.clivern\u003c/groupId\u003e\n    \u003cartifactId\u003eracter\u003c/artifactId\u003e\n    \u003cversion\u003e1.0.5\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nTo add a dependency using Gradle, use the following:\n```java\ndependencies {\n    compile 'com.clivern:racter:1.0.5'\n}\n```\n\nTo add a dependency using Scala SBT, use the following:\n```java\nlibraryDependencies += \"com.clivern\" % \"racter\" % \"1.0.5\"\n```\n\n### Usage\n\nAfter adding the package as a dependency, Please read the following steps:\n\n#### Basic Configurations\nIn order to cofigure the package create `config.properties` file with the following data\n\n```java\napp_id=App ID Goes Here\nverify_token=Verify Token Goes Here\npage_access_token=Page Access Token Goes Here\nlogging_level=debug\nlogging_file_path=src/main/java/resources/\nlogging_file_format=current_date\nlogging_log_type=file\nlogging_current_date_format=yyyy-MM-dd\nlogging_append=true\nlogging_buffered=false\n```\n\nThen import all required classes\n\n```java\nimport com.clivern.racter.BotPlatform;\n\nimport com.clivern.racter.receivers.*;\nimport com.clivern.racter.receivers.webhook.*;\n\nimport com.clivern.racter.senders.*;\nimport com.clivern.racter.senders.templates.*;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.io.IOException;\n```\n\nthen pass the `config.properties` file to the bot platform instance\n\n```java\nBotPlatform platform = new BotPlatform(\"config.properties\");\n```\n\nor Configure it manually\n```java\nMap\u003cString, String\u003e options = new HashMap\u003cString, String\u003e();\n\noptions.put(\"app_id\", \"App ID Goes Here\");\noptions.put(\"verify_token\", \"Verify Token Goes Here\");\noptions.put(\"page_access_token\", \"Page Access Token Goes Here\");\n\noptions.put(\"logging_level\", \"tarce or debug or info or warning or error\");\noptions.put(\"logging_file_path\", \"src/main/java/resources/\");\noptions.put(\"logging_file_format\", \"current_date or app\");\noptions.put(\"logging_log_type\", \"file or console or both\");\noptions.put(\"logging_current_date_format\", \"yyyy-MM-dd\");\noptions.put(\"logging_append\", \"true or false\");\noptions.put(\"logging_buffered\", \"true or false\");\n\nBotPlatform platform = new BotPlatform(options);\n```\n\n### Setup Webhook\n\nCreate a route to verify your verify token, Facebook will perform a GET request to this route URL with some URL parameters to make sure that verify token is correct.\n\n```java\nBotPlatform platform = new BotPlatform(\"config.properties\");\n\nString hubMode = // Get hub.mode query parameter value from the current URL\nString hubVerifyToken = // Get hub.verify_token query parameter value from the current URL\nString hubChallenge = // Get hub.challenge query parameter value from the current URL\n\n\nplatform.getVerifyWebhook().setHubMode(hubMode);\nplatform.getVerifyWebhook().setHubVerifyToken(hubVerifyToken);\nplatform.getVerifyWebhook().setHubChallenge(hubChallenge);\n\nif( platform.getVerifyWebhook().challenge() ){\n\n    // Set Response to be hubChallenge value and status code is 200 like\n    // response.status(200);\n    // return ( hubChallenge != null ) ? hubChallenge : \"\";\n}\n\n// Set Response to be 'Verification token mismatch' and status code is 403 like\n// response.status(403);\n// return \"Verification token mismatch\";\n```\n\nSo let's say we use [Spark Java Framework](http://sparkjava.com/) for our bot, Our route and callback will look like the following:\n\n```java\nimport static spark.Spark.*;\nimport com.clivern.racter.BotPlatform;\nimport com.clivern.racter.receivers.*;\nimport com.clivern.racter.receivers.webhook.*;\n\nimport com.clivern.racter.senders.*;\nimport com.clivern.racter.senders.templates.*;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.io.IOException;\n\npublic class Main {\n\n    public static void main(String[] args) throws IOException\n    {\n        // Verify Token Route\n        get(\"/\", (request, response) -\u003e {\n            BotPlatform platform = new BotPlatform(\"config.properties\");\n            platform.getVerifyWebhook().setHubMode(( request.queryParams(\"hub.mode\") != null ) ? request.queryParams(\"hub.mode\") : \"\");\n            platform.getVerifyWebhook().setHubVerifyToken(( request.queryParams(\"hub.verify_token\") != null ) ? request.queryParams(\"hub.verify_token\") : \"\");\n            platform.getVerifyWebhook().setHubChallenge(( request.queryParams(\"hub.challenge\") != null ) ? request.queryParams(\"hub.challenge\") : \"\");\n\n            if( platform.getVerifyWebhook().challenge() ){\n                response.status(200);\n                return ( request.queryParams(\"hub.challenge\") != null ) ? request.queryParams(\"hub.challenge\") : \"\";\n            }\n\n            response.status(403);\n            return \"Verification token mismatch\";\n        });\n    }\n}\n```\n\nAlso if we use [Spring Boot Framework](https://projects.spring.io/spring-boot/) for our bot, Our route and callback will look like the following:\n\n```java\npackage com.racter.example;\n\nimport org.springframework.boot.*;\nimport org.springframework.boot.autoconfigure.*;\nimport org.springframework.stereotype.*;\nimport org.springframework.web.bind.annotation.*;\n\nimport com.clivern.racter.BotPlatform;\nimport com.clivern.racter.receivers.webhook.*;\n\nimport com.clivern.racter.senders.*;\nimport com.clivern.racter.senders.templates.*;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.io.IOException;\nimport com.mashape.unirest.http.exceptions.UnirestException;\n\n@Controller\n@EnableAutoConfiguration\npublic class Main {\n\n    @RequestMapping(method = RequestMethod.GET, value = \"/\")\n    @ResponseBody\n    String verifyToken(@RequestParam(value=\"hub.mode\", defaultValue=\"\") String hub_mode, @RequestParam(value=\"hub.verify_token\", defaultValue=\"\") String hub_verify_token, @RequestParam(value=\"hub.challenge\", defaultValue=\"\") String hub_challenge ) throws IOException {\n\n        BotPlatform platform = new BotPlatform(\"src/main/java/resources/config.properties\");\n        platform.getVerifyWebhook().setHubMode(hub_mode);\n        platform.getVerifyWebhook().setHubVerifyToken(hub_verify_token);\n        platform.getVerifyWebhook().setHubChallenge(hub_challenge);\n\n        if( platform.getVerifyWebhook().challenge() ){\n            return ( hub_challenge != \"\" ) ? hub_challenge : \"\";\n        }\n\n        return \"Verification token mismatch\";\n    }\n}\n```\n\nAlso if we use [Play Framework](https://www.playframework.com/) for our bot, Our route and callback will look like the following:\n\n```java\npackage controllers;\n\nimport play.mvc.*;\nimport play.mvc.Http.RequestBody;\n\nimport com.clivern.racter.BotPlatform;\nimport com.clivern.racter.receivers.webhook.*;\n\nimport com.clivern.racter.senders.*;\nimport com.clivern.racter.senders.templates.*;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.io.IOException;\nimport com.mashape.unirest.http.exceptions.UnirestException;\n\n/**\n * Home Controller\n */\npublic class HomeController extends Controller {\n\n    protected String basePath = System.getProperty(\"user.dir\");\n\n    public Result verifyToken() throws IOException\n    {\n        BotPlatform platform = new BotPlatform(this.basePath + \"/conf/racter.properties\");\n        platform.getVerifyWebhook().setHubMode(request().getQueryString(\"hub.mode\"));\n        platform.getVerifyWebhook().setHubVerifyToken(request().getQueryString(\"hub.verify_token\"));\n        platform.getVerifyWebhook().setHubChallenge(request().getQueryString(\"hub.challenge\"));\n\n        if( platform.getVerifyWebhook().challenge() ){\n            return ( request().getQueryString(\"hub.challenge\") != null ) ? ok(request().getQueryString(\"hub.challenge\")) : ok();\n        }\n\n        return ok(\"Verification token mismatch\");\n    }\n}\n```\n\n### Message Received\n\nIn order to receive and parse messages, You will need to create another route that receives post requests from Facebook. Our Route should contain a code look like the following:\n\n```java\nString body = // Get current Request Body\nBotPlatform platform = new BotPlatform(\"config.properties\");\nplatform.getBaseReceiver().set(body).parse();\nHashMap\u003cString, MessageReceivedWebhook\u003e messages = (HashMap\u003cString, MessageReceivedWebhook\u003e) platform.getBaseReceiver().getMessages();\nfor (MessageReceivedWebhook message : messages.values()) {\n\n    String user_id = (message.hasUserId()) ? message.getUserId() : \"\";\n    String page_id = (message.hasPageId()) ? message.getPageId() : \"\";\n    String message_id = (message.hasMessageId()) ? message.getMessageId() : \"\";\n    String message_text = (message.hasMessageText()) ? message.getMessageText() : \"\";\n    String quick_reply_payload = (message.hasQuickReplyPayload()) ? message.getQuickReplyPayload() : \"\";\n    Long timestamp = (message.hasTimestamp()) ? message.getTimestamp() : 0;\n    HashMap\u003cString, String\u003e attachments = (message.hasAttachment()) ? (HashMap\u003cString, String\u003e) message.getAttachment() : new HashMap\u003cString, String\u003e();\n\n}\n```\n\nSo let's say we use [Spark Java Framework](http://sparkjava.com/) for our bot, Our route should look like the following:\n\n```java\nimport static spark.Spark.*;\nimport org.pmw.tinylog.Logger;\n\nimport com.clivern.racter.BotPlatform;\nimport com.clivern.racter.receivers.*;\nimport com.clivern.racter.receivers.webhook.*;\n\nimport com.clivern.racter.senders.*;\nimport com.clivern.racter.senders.templates.*;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.io.IOException;\n\npublic class Main {\n\n    public static void main(String[] args) throws IOException\n    {\n        // Verify Token Route\n        get(\"/\", (request, response) -\u003e {\n            BotPlatform platform = new BotPlatform(\"config.properties\");\n            platform.getVerifyWebhook().setHubMode(( request.queryParams(\"hub.mode\") != null ) ? request.queryParams(\"hub.mode\") : \"\");\n            platform.getVerifyWebhook().setHubVerifyToken(( request.queryParams(\"hub.verify_token\") != null ) ? request.queryParams(\"hub.verify_token\") : \"\");\n            platform.getVerifyWebhook().setHubChallenge(( request.queryParams(\"hub.challenge\") != null ) ? request.queryParams(\"hub.challenge\") : \"\");\n\n            if( platform.getVerifyWebhook().challenge() ){\n                response.status(200);\n                return ( request.queryParams(\"hub.challenge\") != null ) ? request.queryParams(\"hub.challenge\") : \"\";\n            }\n\n            response.status(403);\n            return \"Verification token mismatch\";\n        });\n\n        post(\"/\", (request, response) -\u003e {\n            String body = request.body();\n            BotPlatform platform = new BotPlatform(\"config.properties\");\n            platform.getBaseReceiver().set(body).parse();\n            HashMap\u003cString, MessageReceivedWebhook\u003e messages = (HashMap\u003cString, MessageReceivedWebhook\u003e) platform.getBaseReceiver().getMessages();\n            for (MessageReceivedWebhook message : messages.values()) {\n\n                String user_id = (message.hasUserId()) ? message.getUserId() : \"\";\n                String page_id = (message.hasPageId()) ? message.getPageId() : \"\";\n                String message_id = (message.hasMessageId()) ? message.getMessageId() : \"\";\n                String message_text = (message.hasMessageText()) ? message.getMessageText() : \"\";\n                String quick_reply_payload = (message.hasQuickReplyPayload()) ? message.getQuickReplyPayload() : \"\";\n                Long timestamp = (message.hasTimestamp()) ? message.getTimestamp() : 0;\n                HashMap\u003cString, String\u003e attachments = (message.hasAttachment()) ? (HashMap\u003cString, String\u003e) message.getAttachment() : new HashMap\u003cString, String\u003e();\n\n                // Use Logger To Log Incoming Data\n                Logger.info(\"User ID#:\" + user_id);\n                Logger.info(\"Page ID#:\" + page_id);\n                Logger.info(\"Message ID#:\" + message_id);\n                Logger.info(\"Message Text#:\" + message_text);\n                Logger.info(\"Quick Reply Payload#:\" + quick_reply_payload);\n\n                for (String attachment : attachments.values()) {\n                    Logger.info(\"Attachment#:\" + attachment);\n                }\n\n                return \"ok\";\n            }\n\n            // ..\n            // Other Receive Webhooks Goes Here\n            // ..\n\n            return \"No Messages\";\n        });\n    }\n}\n```\n\nAlso if we use [Spring Boot Framework](https://projects.spring.io/spring-boot/) for our bot, Our route and callback will look like the following:\n\n```java\npackage com.racter.example;\n\nimport org.springframework.boot.*;\nimport org.springframework.boot.autoconfigure.*;\nimport org.springframework.stereotype.*;\nimport org.springframework.web.bind.annotation.*;\nimport org.pmw.tinylog.Logger;\n\nimport com.clivern.racter.BotPlatform;\nimport com.clivern.racter.receivers.webhook.*;\n\nimport com.clivern.racter.senders.*;\nimport com.clivern.racter.senders.templates.*;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.io.IOException;\nimport com.mashape.unirest.http.exceptions.UnirestException;\n\n@Controller\n@EnableAutoConfiguration\npublic class Main {\n\n    @RequestMapping(method = RequestMethod.GET, value = \"/\")\n    @ResponseBody\n    String verifyToken(@RequestParam(value=\"hub.mode\", defaultValue=\"\") String hub_mode, @RequestParam(value=\"hub.verify_token\", defaultValue=\"\") String hub_verify_token, @RequestParam(value=\"hub.challenge\", defaultValue=\"\") String hub_challenge ) throws IOException {\n\n        BotPlatform platform = new BotPlatform(\"src/main/java/resources/config.properties\");\n        platform.getVerifyWebhook().setHubMode(hub_mode);\n        platform.getVerifyWebhook().setHubVerifyToken(hub_verify_token);\n        platform.getVerifyWebhook().setHubChallenge(hub_challenge);\n\n        if( platform.getVerifyWebhook().challenge() ){\n            return ( hub_challenge != \"\" ) ? hub_challenge : \"\";\n        }\n        return \"Verification token mismatch\";\n    }\n\n    @RequestMapping(method = RequestMethod.POST, value = \"/\")\n    @ResponseBody\n    String webHook(@RequestBody String body) throws IOException, UnirestException {\n        BotPlatform platform = new BotPlatform(\"config.properties\");\n        platform.getBaseReceiver().set(body).parse();\n        HashMap\u003cString, MessageReceivedWebhook\u003e messages = (HashMap\u003cString, MessageReceivedWebhook\u003e) platform.getBaseReceiver().getMessages();\n        for (MessageReceivedWebhook message : messages.values()) {\n\n            String user_id = (message.hasUserId()) ? message.getUserId() : \"\";\n            String page_id = (message.hasPageId()) ? message.getPageId() : \"\";\n            String message_id = (message.hasMessageId()) ? message.getMessageId() : \"\";\n            String message_text = (message.hasMessageText()) ? message.getMessageText() : \"\";\n            String quick_reply_payload = (message.hasQuickReplyPayload()) ? message.getQuickReplyPayload() : \"\";\n            Long timestamp = (message.hasTimestamp()) ? message.getTimestamp() : 0;\n            HashMap\u003cString, String\u003e attachments = (message.hasAttachment()) ? (HashMap\u003cString, String\u003e) message.getAttachment() : new HashMap\u003cString, String\u003e();\n\n            // Use Logger To Log Incoming Data\n            Logger.info(\"User ID#:\" + user_id);\n            Logger.info(\"Page ID#:\" + page_id);\n            Logger.info(\"Message ID#:\" + message_id);\n            Logger.info(\"Message Text#:\" + message_text);\n            Logger.info(\"Quick Reply Payload#:\" + quick_reply_payload);\n\n            for (String attachment : attachments.values()) {\n                Logger.info(\"Attachment#:\" + attachment);\n            }\n\n            return \"ok\";\n        }\n\n        // ..\n        // Other Receive Webhooks Goes Here\n        // ..\n\n        return \"No Messages\";\n    }\n}\n```\n\nAlso if we use [Play Framework](https://www.playframework.com/) for our bot, Our route and callback will look like the following:\n\n```java\npackage controllers;\n\nimport play.mvc.*;\nimport play.mvc.Http.RequestBody;\nimport org.pmw.tinylog.Logger;\n\nimport com.clivern.racter.BotPlatform;\nimport com.clivern.racter.receivers.webhook.*;\n\nimport com.clivern.racter.senders.*;\nimport com.clivern.racter.senders.templates.*;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.io.IOException;\nimport com.mashape.unirest.http.exceptions.UnirestException;\n\n/**\n * Home Controller\n */\npublic class HomeController extends Controller {\n\n    protected String basePath = System.getProperty(\"user.dir\");\n\n    public Result verifyToken() throws IOException\n    {\n        BotPlatform platform = new BotPlatform(this.basePath + \"/conf/racter.properties\");\n        platform.getVerifyWebhook().setHubMode(request().getQueryString(\"hub.mode\"));\n        platform.getVerifyWebhook().setHubVerifyToken(request().getQueryString(\"hub.verify_token\"));\n        platform.getVerifyWebhook().setHubChallenge(request().getQueryString(\"hub.challenge\"));\n\n        if( platform.getVerifyWebhook().challenge() ){\n            return ( request().getQueryString(\"hub.challenge\") != null ) ? ok(request().getQueryString(\"hub.challenge\")) : ok();\n        }\n        return ok(\"Verification token mismatch\");\n    }\n\n    public Result webHook()  throws IOException, UnirestException\n    {\n        String body = request().body().asJson().toString();\n        BotPlatform platform = new BotPlatform(this.basePath + \"/conf/racter.properties\");\n        platform.getBaseReceiver().set(body.asText()).parse();\n        HashMap\u003cString, MessageReceivedWebhook\u003e messages = (HashMap\u003cString, MessageReceivedWebhook\u003e) platform.getBaseReceiver().getMessages();\n        for (MessageReceivedWebhook message : messages.values()) {\n\n            String user_id = (message.hasUserId()) ? message.getUserId() : \"\";\n            String page_id = (message.hasPageId()) ? message.getPageId() : \"\";\n            String message_id = (message.hasMessageId()) ? message.getMessageId() : \"\";\n            String message_text = (message.hasMessageText()) ? message.getMessageText() : \"\";\n            String quick_reply_payload = (message.hasQuickReplyPayload()) ? message.getQuickReplyPayload() : \"\";\n            Long timestamp = (message.hasTimestamp()) ? message.getTimestamp() : 0;\n            HashMap\u003cString, String\u003e attachments = (message.hasAttachment()) ? (HashMap\u003cString, String\u003e) message.getAttachment() : new HashMap\u003cString, String\u003e();\n\n            Logger.info(\"User ID#:\" + user_id);\n            Logger.info(\"Page ID#:\" + page_id);\n            Logger.info(\"Message ID#:\" + message_id);\n            Logger.info(\"Message Text#:\" + message_text);\n            Logger.info(\"Quick Reply Payload#:\" + quick_reply_payload);\n\n            for (String attachment : attachments.values()) {\n                Logger.info(\"Attachment#:\" + attachment);\n            }\n\n            return ok(\"ok\");\n        }\n        // ..\n        // Other Receive Webhooks Goes Here\n        // ..\n\n\n        return ok(\"No Messages\");\n    }\n}\n```\n\n### Send API\n\n\n#### Sending Message\n\nLet's create an empty message first and fill it with the required data. We can get a new message container from Bot Platform Instance:\n\n```java\nMessageTemplate message_tpl = platform.getBaseSender().getMessageTemplate();\n\n// Let's start to fill the required data here\n// ..\n```\n\nHere's some of the usage cases:\n\n```java\n// get the message.getUserId() from the message received\n\n\n// To send a seen mark\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setSenderAction(\"mark_seen\");\nplatform.getBaseSender().send(message_tpl);\n\n\n// To send a typing on\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setSenderAction(\"typing_on\");\nplatform.getBaseSender().send(message_tpl);\n\n\n// To send a typing off\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setSenderAction(\"typing_off\");\nplatform.getBaseSender().send(message_tpl);\n\n\n// To send text message\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setMessageText(\"Hello World\");\nmessage_tpl.setNotificationType(\"REGULAR\");\nplatform.getBaseSender().send(message_tpl);\n\n\n// To send an image\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setAttachment(\"image\", \"http://techslides.com/demos/samples/sample.jpg\", false);\nmessage_tpl.setNotificationType(\"SILENT_PUSH\");\nplatform.getBaseSender().send(message_tpl);\n\n\n// To send file attachment\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setAttachment(\"file\", \"http://techslides.com/demos/samples/sample.pdf\", false);\nmessage_tpl.setNotificationType(\"NO_PUSH\");\nplatform.getBaseSender().send(message_tpl);\n\n\n// To send a video\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setAttachment(\"video\", \"http://techslides.com/demos/samples/sample.mp4\", false);\nplatform.getBaseSender().send(message_tpl);\n\n\n// To send an audio\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setAttachment(\"audio\", \"http://techslides.com/demos/samples/sample.mp3\", false);\nplatform.getBaseSender().send(message_tpl);\n\n\n// To send a quick text reply with payload buttons\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setMessageText(\"Select a Color!\");\nmessage_tpl.setQuickReply(\"text\", \"Red\", \"text_reply_red_click\", \"\");\nmessage_tpl.setQuickReply(\"text\", \"Green\", \"text_reply_green_click\", \"\");\nmessage_tpl.setQuickReply(\"text\", \"Black\", \"text_reply_black_click\", \"\");\nplatform.getBaseSender().send(message_tpl);\n\n\n// To send a quick text reply with payload buttons (Button with images)\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setMessageText(\"Select a Color!\");\nmessage_tpl.setQuickReply(\"text\", \"Red\", \"text_reply_red_click\", \"http://static.wixstatic.com/media/f0a6df_9ae4c70963244e16ba0d89d021407335.png\");\nmessage_tpl.setQuickReply(\"text\", \"Green\", \"text_reply_green_click\", \"http://static.wixstatic.com/media/f0a6df_9ae4c70963244e16ba0d89d021407335.png\");\nmessage_tpl.setQuickReply(\"text\", \"Black\", \"text_reply_black_click\", \"http://static.wixstatic.com/media/f0a6df_9ae4c70963244e16ba0d89d021407335.png\");\nplatform.getBaseSender().send(message_tpl);\n\n\n// To send location reply\nmessage_tpl.setRecipientId(message.getUserId());\nmessage_tpl.setMessageText(\"Please share your location!\");\nmessage_tpl.setQuickReply(\"location\", \"\", \"\", \"\");\nplatform.getBaseSender().send(message_tpl);\n```\n\nPlease note that to respond to custom payloads, Please do the following:\n\n```java\n// To get the payload value, Use this code\n//   String quick_reply_payload = (message.hasQuickReplyPayload()) ? message.getQuickReplyPayload() : \"\";\n// as shown before\n\nif( quick_reply_payload.equals(\"text_reply_red_click\") ){\n\n    message_tpl.setRecipientId(message.getUserId());\n    message_tpl.setMessageText(\"Red Clicked\");\n    platform.getBaseSender().send(message_tpl);\n\n}else if( quick_reply_payload.equals(\"text_reply_green_click\") ){\n\n    message_tpl.setRecipientId(message.getUserId());\n    message_tpl.setMessageText(\"Green Clicked\");\n    platform.getBaseSender().send(message_tpl);\n\n}else if( quick_reply_payload.equals(\"text_reply_black_click\") ){\n\n    message_tpl.setRecipientId(message.getUserId());\n    message_tpl.setMessageText(\"Black Clicked\");\n    platform.getBaseSender().send(message_tpl);\n\n}\n```\n\n#### Sending Button Message\n\nLet's create an empty message first and fill it with the required data. We can get a new message container from Bot Platform Instance:\n\n```java\nButtonTemplate button_message_tpl = platform.getBaseSender().getButtonTemplate();\n\n// Let's start to fill the required data here\n// ..\n```\n\nHere's some of the usage cases:\n\n```java\n// get the message.getUserId() from the message received\n\n\n// To send a web url button\nbutton_message_tpl.setRecipientId(message.getUserId());\nbutton_message_tpl.setMessageText(\"Click Below!\");\nbutton_message_tpl.setButton(\"web_url\", \"Take the Hat Quiz\", \"https://m.me/petershats?ref=take_quiz\", \"\", \"\");\nplatform.getBaseSender().send(button_message_tpl);\n\n\n// To send a postback button\nbutton_message_tpl.setRecipientId(message.getUserId());\nbutton_message_tpl.setMessageText(\"Click Below!\");\nbutton_message_tpl.setButton(\"postback\", \"Bookmark Item\", \"\", \"DEVELOPER_DEFINED_PAYLOAD\", \"\");\nplatform.getBaseSender().send(button_message_tpl);\n\n\n// To send a phone number button\nbutton_message_tpl.setRecipientId(message.getUserId());\nbutton_message_tpl.setMessageText(\"Click Below!\");\nbutton_message_tpl.setButton(\"phone_number\", \"Call Representative\", \"\", \"+15105551234\", \"\");\nplatform.getBaseSender().send(button_message_tpl);\n\n\n// To send account link button\nbutton_message_tpl.setRecipientId(message.getUserId());\nbutton_message_tpl.setMessageText(\"Click Below!\");\nbutton_message_tpl.setButton(\"account_link\", \"\", \"https://www.example.com/authorize\", \"\", \"\");\nplatform.getBaseSender().send(button_message_tpl);\n\n\n// To send account unlink button\nbutton_message_tpl.setRecipientId(message.getUserId());\nbutton_message_tpl.setMessageText(\"Click Below!\");\nbutton_message_tpl.setButton(\"account_unlink\", \"\", \"\", \"\", \"\");\nplatform.getBaseSender().send(button_message_tpl);\n```\n\n#### Sending List Message\n\nLet's create an empty list message first and fill it with the required data. We can get a new list message container from Bot Platform Instance:\n\n```java\nListTemplate list_message_tpl = platform.getBaseSender().getListTemplate();\n\n// Let's start to fill the required data here\n// ..\n```\n\n#### Sending Generic Message\n\nLet's create an empty generic message first and fill it with the required data. We can get a new generic message container from Bot Platform Instance:\n\n```java\nGenericTemplate generic_message_tpl = platform.getBaseSender().getGenericTemplate();\n\n// Let's start to fill the required data here\n// ..\n```\n\n#### Sending Receipt Message\n\nLet's create an empty receipt message first and fill it with the required data. We can get a new receipt message container from Bot Platform Instance:\n\n```java\nReceiptTemplate receipt_message_tpl = platform.getBaseSender().getReceiptTemplate();\n\n// Let's start to fill the required data here\n// ..\n```\n\nHere's some of the usage cases:\n\n```java\n// get the message.getUserId() from the message received\n\n// To send a receipt message\nreceipt_message_tpl.setRecipientId(message.getUserId());\nreceipt_message_tpl.setRecipientName(\"Stephane Crozatier\");\nreceipt_message_tpl.setOrderNumber(\"12345678902\");\nreceipt_message_tpl.setCurrency(\"USD\");\nreceipt_message_tpl.setPaymentMethod(\"Visa 2345\");\nreceipt_message_tpl.setOrderUrl(\"http://petersapparel.parseapp.com/order?order_id=123456\");\nreceipt_message_tpl.setTimestamp(\"1428444852\");\nreceipt_message_tpl.setElement(\"Classic White T-Shirt\", \"100% Soft and Luxurious Cotton\", \"2\", \"50\", \"USD\", \"https://image.spreadshirtmedia.com/image-server/v1/products/1001491830/views/1,width=800,height=800,appearanceId=2,version=1473664654/black-rap-nation-t-shirt-men-s-premium-t-shirt.png\");\nreceipt_message_tpl.setElement(\"Classic Gray T-Shirt\", \"100% Soft and Luxurious Cotton\", \"2\", \"50\", \"USD\", \"https://static1.squarespace.com/static/57a088e05016e13b82b0beac/t/584fe89720099e4b5211c624/1481631899763/darts-is-my-religion-ally-pally-is-my-church-t-shirt-maenner-maenner-t-shirt.png\");\nreceipt_message_tpl.setAddress(\"1 Hacker Way\", \"\", \"Menlo Park\", \"94025\", \"CA\", \"US\");\nreceipt_message_tpl.setSummary(\"75.00\", \"4.95\", \"6.19\", \"56.14\");\nreceipt_message_tpl.setAdjustment(\"New Customer Discount\", \"20\");\nreceipt_message_tpl.setAdjustment(\"$10 Off Coupon\", \"10\");\nplatform.getBaseSender().send(receipt_message_tpl);\n```\n\n\n### Tutorials \u0026 Examples\n\n\u003e For almost all supported features you can take a look at [`examples/`](https://github.com/Clivern/Racter/tree/master/examples) folder for working examples.\n\nAlso check the following tutorials:\n\n1. [Building Your Messenger Chat Bot with Racter \u0026 SparkJava Framework.](http://clivern.com/how-to-create-a-facebook-messenger-bot-with-java/)\n\n\n## Versioning\n\nFor transparency into our release cycle and in striving to maintain backward compatibility, Racter is maintained under the [Semantic Versioning guidelines](https://semver.org/) and release process is predictable and business-friendly.\n\nSee the [Releases section of our GitHub project](https://github.com/clivern/racter/releases) for changelogs for each release version of Racter. It contains summaries of the most noteworthy changes made in each release.\n\n\n## Bug tracker\n\nIf you have any suggestions, bug reports, or annoyances please report them to our issue tracker at https://github.com/clivern/racter/issues\n\n\n## Security Issues\n\nIf you discover a security vulnerability within Racter, please send an email to [hello@clivern.com](mailto:hello@clivern.com)\n\n\n## Contributing\n\nWe are an open source, community-driven project so please feel free to join us. see the [contributing guidelines](CONTRIBUTING.md) for more details.\n\n\n## License\n\n© 2019, Clivern. Released under [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0).\n\n**Racter** is authored and maintained by [@Clivern](http://github.com/clivern).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclivern%2Fracter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclivern%2Fracter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclivern%2Fracter/lists"}