jatinluthra14

Tra

Dec 15th, 2016
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.65 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. """
  4. apertium_translate.py - Phenny Translation Module
  5. """
  6.  
  7. import re
  8. import urllib.request
  9. import json
  10. import web
  11. from tools import GrumbleError, translate
  12. from modules import more
  13. import operator
  14.  
  15. headers = [(
  16. 'User-Agent', 'Mozilla/5.0' +
  17. '(X11; U; Linux i686)' +
  18. 'Gecko/20071127 Firefox/2.0.0.11'
  19. )]
  20.  
  21.  
  22. ApyerrorData = 'Sorry, the apertium APy did not return any data ☹'
  23. ApyerrorHttp = 'Sorry, the apertium APy gave HTTP error %s: %s ☹'
  24.  
  25.  
  26. def translate(translate_me, input_lang, output_lang='en'):
  27. opener = urllib.request.build_opener()
  28. opener.addheaders = headers
  29.  
  30. input_lang, output_lang = web.quote(input_lang), web.quote(output_lang)
  31. translate_me = web.quote(translate_me)
  32.  
  33. response = opener.open(phenny.config.APy_url+'/translate?q='+translate_me+'&langpair='+input_lang+"|"+output_lang).read()
  34.  
  35. responseArray = json.loads(response.decode('utf-8'))
  36. if int(responseArray['responseStatus']) != 200:
  37. raise GrumbleError(ApyerrorHttp % (responseArray['responseStatus'], responseArray['responseDetails']))
  38. if responseArray['responseData']['translatedText'] == []:
  39. raise GrumbleError(ApyerrorData)
  40.  
  41. translated_text = responseArray['responseData']['translatedText']
  42. return translated_text
  43.  
  44.  
  45. def apertium_translate(phenny, input):
  46. """Translates a phrase using the apertium APY"""
  47. line = input.group(2)
  48. if not line:
  49. raise GrumbleError("Need something to translate!")
  50. # line = line.encode('utf-8')
  51.  
  52. pairs = []
  53. guidelines = line.split('|')
  54. if len(guidelines) > 1:
  55. for guideline in guidelines[1:]:
  56. # phenny.say(guideline)
  57. pairs.append(guideline.strip().split('-'))
  58. guidelines = guidelines[0]
  59. # phenny.say("guidelines: "+str(guidelines))
  60. stuff = re.search('(.*) ([a-z]+-[a-z]+)', guidelines)
  61. # phenny.say('groups: '+str(stuff.groups()))
  62. pairs.insert(0, stuff.group(2).split('-'))
  63. translate_me = stuff.group(1)
  64. # phenny.say(str(pairs))
  65.  
  66. # output_lang = line.split(' ')[-1]
  67. # input_lang = line.split(' ')[-2]
  68. # translate_me = ' '.join(line.split(' ')[:-2])
  69.  
  70. if (len(translate_me) > 350) and (not input.admin):
  71. raise GrumbleError('Phrase must be under 350 characters.')
  72.  
  73. msg = translate_me
  74. translated = ""
  75. for (input_lang, output_lang) in pairs:
  76. if input_lang == output_lang:
  77. raise GrumbleError('Stop trying to confuse me! Pick different languages ;)')
  78. msg = translate(msg, input_lang, output_lang)
  79. if not msg:
  80. raise GrumbleError('The %s to %s translation failed, sorry!' % (input_lang, output_lang))
  81. msg = web.decode(msg) # msg.replace(''', "'")
  82. translated = msg
  83.  
  84. # if not finalmsg:
  85. # finalmsg = translated
  86. # phenny.reply(finalmsg)
  87. phenny.reply(translated)
  88.  
  89.  
  90. def apertium_listlangs(phenny, input):
  91. """Lists languages available for translation from/to"""
  92.  
  93. opener = urllib.request.build_opener()
  94. opener.addheaders = headers
  95.  
  96. response = opener.open(phenny.config.APy_url+'/listPairs').read()
  97.  
  98. langs = json.loads(response.decode('utf-8'))
  99. if int(langs['responseStatus']) != 200:
  100. raise GrumbleError(ApyerrorHttp % (langs['responseStatus'], langs['responseDetails']))
  101. if langs['responseData'] == []:
  102. raise GrumbleError(ApyerrorData)
  103.  
  104. outlangs = []
  105. # phenny.say(str(langs))
  106. for pair in langs['responseData']:
  107. if pair['sourceLanguage'] not in outlangs:
  108. outlangs.append(pair['sourceLanguage'])
  109. if pair['targetLanguage'] not in outlangs:
  110. outlangs.append(pair['targetLanguage'])
  111. # phenny.say(str(outlangs))
  112.  
  113. extra = "; more info: .listpairs lg"
  114.  
  115. first = True
  116. allLangs = ""
  117. for lang in outlangs:
  118. if not first:
  119. allLangs += ", "
  120. else:
  121. first = False
  122. allLangs += lang
  123. phenny.say(allLangs + extra)
  124.  
  125.  
  126. def apertium_listpairs(phenny, input):
  127. """Lists translation pairs available to apertium translation"""
  128. lang = input.group(2)
  129.  
  130. opener = urllib.request.build_opener()
  131. opener.addheaders = headers
  132.  
  133. response = opener.open(phenny.config.APy_url+'/listPairs').read()
  134.  
  135. langs = json.loads(response.decode('utf-8'))
  136.  
  137. langs = json.loads(response.decode('utf-8'))
  138. if langs['responseData'] is []:
  139. raise GrumbleError(ApyerrorData)
  140. if int(langs['responseStatus']) != 200:
  141. raise GrumbleError(ApyerrorHttp % (langs['responseStatus'], langs['responseDetails']))
  142.  
  143. if not lang:
  144. allpairs = ""
  145. first = True
  146. for pair in langs['responseData']:
  147. if not first:
  148. allpairs += ","
  149. else:
  150. first = False
  151. allpairs += "%s→%s" % (pair['sourceLanguage'], pair['targetLanguage'])
  152. phenny.say(allpairs)
  153. else:
  154. toLang = []
  155. fromLang = []
  156. for pair in langs['responseData']:
  157. if pair['sourceLanguage'] == lang:
  158. fromLang.append(pair['targetLanguage'])
  159. if pair['targetLanguage'] == lang:
  160. toLang.append(pair['sourceLanguage'])
  161. first = True
  162. froms = ""
  163. for lg in fromLang:
  164. if not first:
  165. froms += ", "
  166. else:
  167. first = False
  168. froms += lg
  169. first = True
  170. tos = ""
  171. for lg in toLang:
  172. if not first:
  173. tos += ", "
  174. else:
  175. first = False
  176. tos += lg
  177. # finals = froms + (" → %s → " % lang) + tos
  178. finals = tos + (" → %s → " % lang) + froms
  179.  
  180. phenny.say(finals)
  181.  
  182. apertium_listpairs.name = 'listpairs'
  183. apertium_listpairs.commands = ['listpairs']
  184. apertium_listpairs.example = '.listpairs ca'
  185. apertium_listpairs.priority = 'low'
  186.  
  187. apertium_listlangs.name = 'listlangs'
  188. apertium_listlangs.commands = ['listlangs']
  189. apertium_listlangs.example = '.listlangs'
  190. apertium_listlangs.priority = 'low'
  191.  
  192. apertium_translate.name = 't'
  193. apertium_translate.commands = ['t']
  194. apertium_translate.example = '.t I like pie en-es'
  195. apertium_translate.priority = 'high'
  196.  
  197.  
  198. def apertium_analyse(phenny, input):
  199. """Analyse text using Apertium APY"""
  200. lang, text = input.groups()
  201.  
  202. opener = urllib.request.build_opener()
  203. opener.addheaders = headers
  204.  
  205. constructed_url = phenny.config.APy_analyseURL + '/analyse?lang=' + web.quote(lang)
  206. constructed_url += '&q=' + web.quote(text.strip())
  207.  
  208. try:
  209. response = opener.open(constructed_url).read()
  210. except urllib.error.HTTPError as error:
  211. response = error.read()
  212. jobj = json.loads(response.decode('utf-8'))
  213. if 'explanation' in jobj:
  214. phenny.say('The following error occurred: ' + jobj['explanation'])
  215. else:
  216. phenny.say('An error occurred: ' + str(error))
  217. return
  218.  
  219. jobj = json.loads(response.decode('utf-8'))
  220. messages = []
  221. for analysis, original in jobj:
  222. messages.append(original + " → " + analysis)
  223.  
  224. more.add_messages(input.nick, phenny,
  225. "\n".join(messages),
  226. break_up=lambda x, y: x.split('\n'))
  227.  
  228. apertium_analyse.name = 'analyse'
  229. apertium_analyse.rule = r'\.analy[sz]e\s(\S*)\s(.*)'
  230. apertium_analyse.example = '.analyse kaz Сен бардың ба'
  231. apertium_analyse.priority = 'high'
  232.  
  233.  
  234. def apertium_generate(phenny, input):
  235. """Use Apertium APY's generate functionality"""
  236. lang, text = input.groups()
  237.  
  238. opener = urllib.request.build_opener()
  239. opener.addheaders = headers
  240.  
  241. constructed_url = phenny.config.APy_analyseURL + '/generate?lang=' + web.quote(lang)
  242. constructed_url += '&q=' + web.quote(text.strip())
  243.  
  244. try:
  245. response = opener.open(constructed_url).read()
  246. except urllib.error.HTTPError as error:
  247. response = error.read()
  248. jobj = json.loads(response.decode('utf-8'))
  249. if 'explanation' in jobj:
  250. phenny.say('The following error occurred: ' + jobj['explanation'])
  251. else:
  252. phenny.say('An error occurred: ' + str(error))
  253. return
  254.  
  255. jobj = json.loads(response.decode('utf-8'))
  256. messages = []
  257. for generation, original in jobj:
  258. messages.append(original + " → " + generation)
  259.  
  260. more.add_messages(input.nick, phenny,
  261. "\n".join(messages),
  262. break_up=lambda x, y: x.split('\n'))
  263.  
  264. apertium_generate.name = 'generate'
  265. apertium_generate.rule = r'\.(?:generate|gen)\s(\S*)\s(.*)'
  266. apertium_generate.example = '.gen kaz ^сен<v><tv><imp><p2><sg>$'
  267. apertium_generate.priority = 'high'
  268.  
  269. def apertium_identlang(phenny, input):
  270. """Identify Language using Apertium APY"""
  271. lang, text = input.groups()
  272.  
  273. opener = urllib.request.build_opener()
  274. opener.addheaders = headers
  275.  
  276. constructed_url = phenny.config.APy_url + '/identifyLang?q=' + web.quote(text.strip())
  277.  
  278. try:
  279. response = opener.open(constructed_url).read()
  280. jsdata = json.loads(response.decode('utf-8'))
  281. except urllib.error.HTTPError as error:
  282. response = error.read()
  283. phenny.say(response)
  284. messages = []
  285. for key, value in jsdata.items():
  286. messages.append(key + " = " + str(value))
  287. more.add_messages(input.nick, phenny,
  288. "\n".join(messages),
  289. break_up=lambda x, y: x.split('\n'))
  290.  
  291. apertium_identlang.name = 'identlang'
  292. apertium_identlang.commands = ['identlang']
  293. apertium_identlang.example = '.identlang Whereas disregard and contempt for which have outraged the conscience of mankind'
  294. apertium_identlang.priority = 'high'
  295.  
  296. def apertium_stats(phenny,input):
  297.  
  298. opener = urllib.request.build_opener()
  299. opener.addheaders = headers
  300.  
  301. constructed_url = phenny.config.APy_url + '/stats'
  302.  
  303. try:
  304. response = opener.open(constructed_url).read()
  305. jdata = json.loads(response.decode('utf-8'))
  306. holdingPipes = jdata['responseData']['holdingPipes']
  307. uptime = jdata['responseData']['uptime']
  308. periodStats = jdata['responseData']['periodStats']
  309. useCount = jdata['responseData']['useCount']
  310. except urllib.error.HTTPError as error:
  311. response = error.read()
  312. phenny.say(response)
  313. messages = []
  314. for key, value in periodStats.items():
  315. messages.append(key + " = " + str(double(value)))
  316. f_message = "HoldingPipes: " + str(holdingPipes) + " UpTime: " + str(uptime) + " Period Stats: " + " ".join(messages)
  317. messages = []
  318. for key, value in useCount.items():
  319. messages.append(key + " = " + str(value))
  320. lines = sorted(useCount.items(), key=operator.itemgetter(1),reverse=True)
  321. replaced_messages = []
  322. for x in lines:
  323. x = "".join(str(x))
  324. x = x.replace("(", "")
  325. x = x.replace(")", "")
  326. x = x.replace("'", "")
  327. x = x.replace(",", ":")
  328. replaced_messages.append(x)
  329. y =9
  330. while(y<99):
  331. r = f_message + " " + "Use Count: " + ", ".join(replaced_messages[:y])
  332. max_length = 428 - len(input.nick)
  333. rs = f_message + " " + "Use Count: " + ", ".join(replaced_messages[:y+1])
  334. rst = len(rs)
  335. if(max_length>=rst):
  336. y=y+1
  337. else:
  338. break
  339. phenny.say(f_message + " " + "Use Count: " + ", ".join(replaced_messages[:y]))
  340. apertium_stats.name = 'apystats'
  341. apertium_stats.commands = ['apystats']
  342. apertium_stats.example = '.apystats'
  343. apertium_stats.priority = 'high'
  344.  
  345. def apertium_calccoverage(phenny, input):
  346. """Get Coverage using Apertium APY"""
  347. lang, text = input.groups()
  348.  
  349. opener = urllib.request.build_opener()
  350. opener.addheaders = headers
  351.  
  352. constructed_url = phenny.config.APy_url + '/getCoverage?lang=' + web.quote(lang)
  353. constructed_url += '&q=' + web.quote(text.strip())
  354.  
  355. try:
  356. response = opener.open(constructed_url).read()
  357. jsdata = json.loads(response.decode('utf-8'))
  358. except urllib.error.HTTPError as error:
  359. response = error.read()
  360. phenny.say(response)
  361. messages = []
  362. for key, value in jsdata.items():
  363. messages.append(key + " = " + str(value))
  364. more.add_messages(input.nick, phenny,
  365. "\n".join(messages),
  366. break_up=lambda x, y: x.split('\n'))
  367.  
  368. apertium_calccoverage.name = 'calccoverage'
  369. apertium_calccoverage.commands = ['calccoverage']
  370. apertium_calccoverage.example = '.calccoverage en-es Whereas disregard and contempt for which have outraged the conscience of mankind'
  371. apertium_identlang.priority = 'high'
Add Comment
Please, Sign In to add comment