@wickr-sample-integrations/wickrio-translation-bot
Version:
Using the AWS SDK for JavaScript V3 to create a Translation chatbot within Wickr.
210 lines (175 loc) • 5.67 kB
JavaScript
const WickrIOBotAPI = require('wickrio-bot-api');
const util = require('util')
const logger = require('wickrio-bot-api').logger
const FileReader = require('filereader')
const bot = new WickrIOBotAPI.WickrIOBot();
const WickrIOAPI = bot.apiService().WickrIOAPI;
//const RecognizeCelebritiesCommand = require('@aws-sdk/client-rekognition');
//const { RekognitionClient } = require('@aws-sdk/client-rekognition');
const { fromIni } = require('@aws-sdk/credential-providers');
//const { DetectLabelsCommand } = require("@aws-sdk/client-rekognition");
const { ComprehendClient } = require('@aws-sdk/client-comprehend');
const { CognitoIdentityClient } = require('@aws-sdk/client-cognito-identity');
const { TranslateClient } = require('@aws-sdk/client-translate');
const { DetectDominantLanguageCommand } = require('@aws-sdk/client-comprehend');
const { TranslateTextCommand } = require('@aws-sdk/client-translate');
// snippet-start:[s3.JavaScript.buckets.uploadV3]
//const { PutObjectCommand } = require("@aws-sdk/client-s3");
//const { fileURLToPath } = require("url");
console.log = function () {
logger.info(util.format.apply(null, arguments))
}
console.error = function () {
logger.error(util.format.apply(null, arguments))
}
var fs = require('fs');
var path = require('path');
module.exports = WickrIOAPI;
process.stdin.resume(); //so the program will not close instantly
async function exitHandler(options, err) {
try {
var closed = await bot.close();
console.log(closed);
if (err) {
console.log("Exit Error:", err);
process.exit();
}
if (options.exit) {
process.exit();
} else if (options.pid) {
process.kill(process.pid);
}
} catch (err) {
console.log(err);
}
}
//catches ctrl+c and stop.sh events
process.on('SIGINT', exitHandler.bind(null, {
exit: true
}));
// catches "kill pid" (for example: nodemon restart)
process.on('SIGUSR1', exitHandler.bind(null, {
pid: true
}));
process.on('SIGUSR2', exitHandler.bind(null, {
pid: true
}));
//catches uncaught exceptions
process.on('uncaughtException', exitHandler.bind(null, {
exit: true
}));
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// Respond to user's input.
async function createResponse(message, vGroupID) {
// setup the clients
bot.processesJsonToProcessEnv()
var tokens = JSON.parse(process.env.tokens)
const REGION = tokens.AWS_REGION.value
const profileName = tokens.AWS_PROFILENAME.value
console.log('entered createResponse')
// Create an Amazon Comprehend service client object.
const comprehendClient = new ComprehendClient({
region: REGION,
credentials: fromIni({profile: profileName,}),
})
// Create an Amazon Translate service client object.
const translateClient = new TranslateClient({
region: REGION,
credentials: fromIni({profile: profileName,}),
});
const comprehendParams = {
Text: message,
};
try {
const data = await comprehendClient.send(
new DetectDominantLanguageCommand(comprehendParams)
);
console.log(
"Success. The language code is: ",
data.Languages[0].LanguageCode
);
// Hard code from english to french
var transToLanguage = "fr";
if (data.Languages[0].LanguageCode === "en") {
transToLanguage = "fr";
} else {
transToLanguage = "en"
}
const translateParams = {
SourceLanguageCode: data.Languages[0].LanguageCode,
TargetLanguageCode: transToLanguage,
Text: message,
};
// Save the original language
const sourceLanguageCode = data.Languages[0].LanguageCode
try {
const data = await translateClient.send(
new TranslateTextCommand(translateParams)
);
console.log("Success. Translated text: ", data.TranslatedText);
var sMessage = await WickrIOAPI.cmdSendRoomMessage(vGroupID, data.TranslatedText);
} catch (err) {
console.log("Error translating text. ", err);
}
} catch (err) {
console.log("Error identifying language. ", err);
}
}
async function main() {
logger.info('entering main')
try {
var status;
if (process.argv[2] === undefined) {
var bot_username = fs.readFileSync('client_bot_username.txt', 'utf-8');
bot_username = bot_username.trim();
status = await bot.start(bot_username)
} else {
status = await bot.start(process.argv[2])
}
if (!status) {
exitHandler(null, {
exit: true,
reason: 'Client not able to start'
});
}
// set the avatar
const avatarPath=path.join(process.cwd(), 'awsTranslate.jpeg')
logger.info(`avatar path:${avatarPath}`)
if (await WickrIOAPI.cmdSetAvatar(avatarPath)) {
logger.info('avatar set')
} else {
logger.info('avatar NOT set')
}
await bot.startListening(listen); //Passes a callback function that will receive incoming messages into the bot client
} catch (err) {
logger.error(err);
}
}
async function listen(rMessage) {
logger.info('entering listen')
/*
try {
const messageService = bot.messageService({rMessage})
const {
user,
userEmail,
isAdmin,
} = messageService
} catch (err) {
logger.error(err);
}
*/
rMessage = JSON.parse(rMessage);
var sender = rMessage.sender;
var vGroupID = rMessage.vgroupid;
var userArr = [];
userArr.push(sender);
if (rMessage.message) {
var request = rMessage.message;
console.log('calling createResponse()')
await createResponse(request, vGroupID)
}
}
main();