mirror of
https://github.com/oddluck/limnoria-plugins.git
synced 2025-04-26 04:51:09 -05:00
Add 'UrbanDictionary/' from commit '4a9829583291a692fc8e33adeb666fd8d2fff793'
git-subtree-dir: UrbanDictionary git-subtree-mainline: cd5e994b940625ceea7f5e2a510452f7b7df2a35 git-subtree-split: 4a9829583291a692fc8e33adeb666fd8d2fff793
This commit is contained in:
commit
d66a75ecdf
27
UrbanDictionary/.gitignore
vendored
Normal file
27
UrbanDictionary/.gitignore
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
*.py[co]
|
||||||
|
|
||||||
|
# Packages
|
||||||
|
*.egg
|
||||||
|
*.egg-info
|
||||||
|
dist
|
||||||
|
build
|
||||||
|
eggs
|
||||||
|
parts
|
||||||
|
bin
|
||||||
|
var
|
||||||
|
sdist
|
||||||
|
develop-eggs
|
||||||
|
.installed.cfg
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
.coverage
|
||||||
|
.tox
|
||||||
|
|
||||||
|
#Translations
|
||||||
|
*.mo
|
||||||
|
|
||||||
|
#Mr Developer
|
||||||
|
.mr.developer.cfg
|
23
UrbanDictionary/.travis.yml
Normal file
23
UrbanDictionary/.travis.yml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
language: python
|
||||||
|
python:
|
||||||
|
- "2.7"
|
||||||
|
- "3.4"
|
||||||
|
- pypy
|
||||||
|
# command to install dependencies,
|
||||||
|
install:
|
||||||
|
- pip install -vr requirements.txt||true
|
||||||
|
# command to run tests, e.g. python setup.py test
|
||||||
|
script:
|
||||||
|
- echo $TRAVIS_PYTHON_VERSION
|
||||||
|
- cd .. && supybot-test UrbanDictionary
|
||||||
|
notifications:
|
||||||
|
email: false
|
||||||
|
irc:
|
||||||
|
channels:
|
||||||
|
- "irc.efnet.net#supybot"
|
||||||
|
template:
|
||||||
|
- "Build #%{build_number}: %{repository} %{branch} (%{commit}) %{author} - %{message}"
|
||||||
|
- "Build details: \x03 %{build_url}"
|
||||||
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
|
|
20
UrbanDictionary/LICENSE.txt
Normal file
20
UrbanDictionary/LICENSE.txt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 spline
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
45
UrbanDictionary/README.md
Normal file
45
UrbanDictionary/README.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
[](https://travis-ci.org/reticulatingspline/UrbanDictionary)
|
||||||
|
|
||||||
|
# Limnoria plugin for UrbanDictionary
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
Limnoria plugin for querying [UrbanDictionary](http://www.urbandictionary.com)
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
You will need a working Limnoria bot on Python 2.7 for this to work.
|
||||||
|
|
||||||
|
Go into your Limnoria plugin dir, usually ~/supybot/plugins and run:
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://github.com/reticulatingspline/UrbanDictionary
|
||||||
|
```
|
||||||
|
|
||||||
|
To install additional requirements, run:
|
||||||
|
|
||||||
|
```
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, load the plugin:
|
||||||
|
|
||||||
|
```
|
||||||
|
/msg bot load UrbanDictionary
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
<spline> @ud spline
|
||||||
|
<myybot> spline :: The object which Maxis likes to reticulate. [ex:] 1: "What are you reticulating, dude?"2: "My favorite dish-- Splines!" [/ex]
|
||||||
|
```
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
All of my plugins are free and open source. When I first started out, one of the main reasons I was
|
||||||
|
able to learn was due to other code out there. If you find a bug or would like an improvement, feel
|
||||||
|
free to give me a message on IRC or fork and submit a pull request. Many hours do go into each plugin,
|
||||||
|
so, if you're feeling generous, I do accept donations via Amazon or browse my [wish list](http://amzn.com/w/380JKXY7P5IKE).
|
||||||
|
|
||||||
|
I'm always looking for work, so if you are in need of a custom feature, plugin or something bigger, contact me via GitHub or IRC.
|
43
UrbanDictionary/__init__.py
Normal file
43
UrbanDictionary/__init__.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
###
|
||||||
|
# Copyright (c) 2012-2013, spline
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
###
|
||||||
|
|
||||||
|
"""
|
||||||
|
Add a description of the plugin (to be presented to the user inside the wizard)
|
||||||
|
here. This should describe *what* the plugin does.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import supybot
|
||||||
|
import supybot.world as world
|
||||||
|
|
||||||
|
# Use this for the version of this plugin. You may wish to put a CVS keyword
|
||||||
|
# in here if you're keeping the plugin in CVS or some similar system.
|
||||||
|
__version__ = ""
|
||||||
|
|
||||||
|
# XXX Replace this with an appropriate author or supybot.Author instance.
|
||||||
|
__author__ = supybot.authors.unknown
|
||||||
|
|
||||||
|
# This is a dictionary mapping supybot.Author instances to lists of
|
||||||
|
# contributions.
|
||||||
|
__contributors__ = {}
|
||||||
|
|
||||||
|
# This is a url where the most recent plugin package can be downloaded.
|
||||||
|
__url__ = ''
|
||||||
|
|
||||||
|
from . import config
|
||||||
|
from . import plugin
|
||||||
|
from imp import reload
|
||||||
|
reload(plugin) # In case we're being reloaded.
|
||||||
|
# Add more reloads here if you add third-party modules and want them to be
|
||||||
|
# reloaded when this plugin is reloaded. Don't forget to import them as well!
|
||||||
|
|
||||||
|
if world.testing:
|
||||||
|
from . import test
|
||||||
|
|
||||||
|
Class = plugin.Class
|
||||||
|
configure = config.configure
|
||||||
|
|
||||||
|
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
|
27
UrbanDictionary/config.py
Normal file
27
UrbanDictionary/config.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
###
|
||||||
|
# Copyright (c) 2012-2013, spline
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
###
|
||||||
|
|
||||||
|
import supybot.conf as conf
|
||||||
|
import supybot.registry as registry
|
||||||
|
from supybot.i18n import PluginInternationalization, internationalizeDocstring
|
||||||
|
|
||||||
|
_ = PluginInternationalization('UrbanDictionary')
|
||||||
|
|
||||||
|
def configure(advanced):
|
||||||
|
# This will be called by supybot to configure this module. advanced is
|
||||||
|
# a bool that specifies whether the user identified himself as an advanced
|
||||||
|
# user or not. You should effect your configuration by manipulating the
|
||||||
|
# registry as appropriate.
|
||||||
|
from supybot.questions import expect, anything, something, yn
|
||||||
|
conf.registerPlugin('UrbanDictionary', True)
|
||||||
|
|
||||||
|
|
||||||
|
UrbanDictionary = conf.registerPlugin('UrbanDictionary')
|
||||||
|
conf.registerChannelValue(UrbanDictionary, 'maxNumberOfDefinitions', registry.Integer(10, """Number of definition and examples in output. Max 10."""))
|
||||||
|
conf.registerChannelValue(UrbanDictionary, 'disableANSI', registry.Boolean(False, """Do not display any ANSI formatting codes in output."""))
|
||||||
|
|
||||||
|
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=250:
|
1
UrbanDictionary/local/__init__.py
Normal file
1
UrbanDictionary/local/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
# Stub so local is a module, used for third-party modules
|
158
UrbanDictionary/plugin.py
Normal file
158
UrbanDictionary/plugin.py
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
###
|
||||||
|
# Copyright (c) 2012-2013, spline
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
###
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
# my libs
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
# supybot libs
|
||||||
|
import supybot.utils as utils
|
||||||
|
from supybot.commands import *
|
||||||
|
import supybot.plugins as plugins
|
||||||
|
import supybot.ircutils as ircutils
|
||||||
|
import supybot.callbacks as callbacks
|
||||||
|
from supybot.i18n import PluginInternationalization, internationalizeDocstring
|
||||||
|
|
||||||
|
_ = PluginInternationalization('UrbanDictionary')
|
||||||
|
|
||||||
|
@internationalizeDocstring
|
||||||
|
class UrbanDictionary(callbacks.Plugin):
|
||||||
|
"""Add the help for "@plugin help UrbanDictionary" here
|
||||||
|
This should describe *how* to use this plugin."""
|
||||||
|
threaded = True
|
||||||
|
|
||||||
|
######################
|
||||||
|
# INTERNAL FUNCTIONS #
|
||||||
|
######################
|
||||||
|
|
||||||
|
def _red(self, string):
|
||||||
|
"""return a red string."""
|
||||||
|
return ircutils.mircColor(string, 'red')
|
||||||
|
|
||||||
|
def _bu(self, string):
|
||||||
|
"""bold and underline string."""
|
||||||
|
return ircutils.bold(ircutils.underline(string))
|
||||||
|
|
||||||
|
def cleanjson(self, s):
|
||||||
|
"""clean up json and return."""
|
||||||
|
|
||||||
|
s = s.replace('\n', '')
|
||||||
|
s = s.replace('\r', '')
|
||||||
|
s = s.replace('\t', '')
|
||||||
|
s = s.strip()
|
||||||
|
# return
|
||||||
|
return s
|
||||||
|
|
||||||
|
####################
|
||||||
|
# PUBLIC FUNCTIONS #
|
||||||
|
####################
|
||||||
|
|
||||||
|
def urbandictionary(self, irc, msg, args, optlist, optterm):
|
||||||
|
"""[--disableexamples | --showvotes | --num # | --showtags] <term>
|
||||||
|
|
||||||
|
Fetches definition for <term> on UrbanDictionary.com
|
||||||
|
|
||||||
|
Use --disableexamples to not display examples.
|
||||||
|
Use --showvotes to show votes [default: off]
|
||||||
|
Use --num # to limit the number of definitions. [default:10]
|
||||||
|
Use --showtags to display tags (if available)
|
||||||
|
"""
|
||||||
|
|
||||||
|
# default args for output. can manip via --getopts.
|
||||||
|
args = {'showExamples': True,
|
||||||
|
'numberOfDefinitions':self.registryValue('maxNumberOfDefinitions'),
|
||||||
|
'showVotes': False,
|
||||||
|
'showTags':False
|
||||||
|
}
|
||||||
|
# optlist to change args.
|
||||||
|
if optlist:
|
||||||
|
for (key, value) in optlist:
|
||||||
|
if key == 'disableexamples':
|
||||||
|
args['showExamples'] = False
|
||||||
|
if key == 'showvotes':
|
||||||
|
args['showVotes'] = True
|
||||||
|
if key == 'showtags':
|
||||||
|
args['showTags'] = True
|
||||||
|
if key == 'num': # if number is >, default to config var.
|
||||||
|
if 0 <= value <= self.registryValue('maxNumberOfDefinitions'):
|
||||||
|
args['numberOfDefinitions'] = value
|
||||||
|
# build and fetch url.
|
||||||
|
url = 'http://api.urbandictionary.com/v0/define?term=%s' % utils.web.urlquote(optterm)
|
||||||
|
try:
|
||||||
|
html = utils.web.getUrl(url)
|
||||||
|
except utils.web.Error as e:
|
||||||
|
self.log.error("ERROR opening {0} message: {1}".format(url, e))
|
||||||
|
irc.reply("ERROR: could not open {0} message: {1}".format(url, e))
|
||||||
|
return
|
||||||
|
# try parsing json.
|
||||||
|
#irc.reply("{0}".format(self._repairjson(html.decode('utf-8'))))
|
||||||
|
try:
|
||||||
|
#jsondata = self._repairjson(html.decode('utf-8')) # decode utf-8. fix \r\n that ud puts in below.
|
||||||
|
jsondata = html.decode('utf-8')
|
||||||
|
jsondata = json.loads(jsondata) # odds chars in UD.
|
||||||
|
except Exception as e:
|
||||||
|
self.log.error("Error parsing JSON from UD: {0}".format(e))
|
||||||
|
irc.reply("ERROR: Failed to parse json data. Check logs for error")
|
||||||
|
return
|
||||||
|
# process json.
|
||||||
|
results = jsondata.get('result_type') # exact, no_results, fulltext .
|
||||||
|
if not results:
|
||||||
|
# assume exact i guess...
|
||||||
|
results = 'exact'
|
||||||
|
definitions = jsondata.get('list')
|
||||||
|
# prep output now depending on results.
|
||||||
|
if results == "exact": # we did not find anything.
|
||||||
|
outdefs = []
|
||||||
|
for i in definitions[0:args['numberOfDefinitions']]: # iterate through each def.
|
||||||
|
# clean these up.
|
||||||
|
definition = self.cleanjson(''.join(i['definition'])) #.encode('utf-8')
|
||||||
|
example = self.cleanjson(''.join(i['example']))
|
||||||
|
# now add
|
||||||
|
outputstring = "{0}".format(definition) # default string.
|
||||||
|
if args['showExamples']: # show examples?
|
||||||
|
outputstring += " {0} {1} {2}".format(self._bu("[ex:]"), example, self._bu("[/ex]"))
|
||||||
|
if args['showVotes']: # show votes?
|
||||||
|
outputstring += " (+{0}/-{1})".format(i['thumbs_up'], i['thumbs_down'])
|
||||||
|
outdefs.append(outputstring) # add to our list.
|
||||||
|
output = " | ".join([item for item in outdefs]) # create string with everything.
|
||||||
|
elif results == "fulltext": # not direct. yields related terms.
|
||||||
|
output = " | ".join(sorted(set([item['word'] for item in definitions]))) # sorted, unique words.
|
||||||
|
# output time.
|
||||||
|
if results == "no_results" or len(definitions) == 0: # NOTHING FOUND.
|
||||||
|
irc.reply("ERROR: '{0}' not defined on UrbanDictionary.".format(optterm))
|
||||||
|
return
|
||||||
|
else: # we have definitions, so we're gonna output.
|
||||||
|
# check if we should add tags.
|
||||||
|
if args['showTags']: # display tags.
|
||||||
|
tags = jsondata.get('tags')
|
||||||
|
if tags: # we have tags. add it to optterm.
|
||||||
|
tags = " | ".join([i for i in tags])
|
||||||
|
else:
|
||||||
|
tags = False
|
||||||
|
else:
|
||||||
|
tags = False
|
||||||
|
# now lets output.
|
||||||
|
if self.registryValue('disableANSI'): # disable formatting.
|
||||||
|
if tags:
|
||||||
|
irc.reply("{0} :: {1} :: {2}".format(optterm, tags, ircutils.stripFormatting(output)))
|
||||||
|
else:
|
||||||
|
irc.reply("{0} :: {1}".format(optterm, ircutils.stripFormatting(output)))
|
||||||
|
else: # colors.
|
||||||
|
if tags:
|
||||||
|
irc.reply("{0} :: {1} :: {2}".format(self._red(optterm), tags, output))
|
||||||
|
else:
|
||||||
|
irc.reply("{0} :: {1}".format(self._red(optterm), output))
|
||||||
|
|
||||||
|
urbandictionary = wrap(urbandictionary, [getopts({'showtags':'',
|
||||||
|
'showvotes':'',
|
||||||
|
'num':('int'),
|
||||||
|
'disableexamples':''}), ('text')])
|
||||||
|
|
||||||
|
Class = UrbanDictionary
|
||||||
|
|
||||||
|
|
||||||
|
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=250:
|
1
UrbanDictionary/requirements.txt
Normal file
1
UrbanDictionary/requirements.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
git+https://github.com/ProgVal/Limnoria.git
|
18
UrbanDictionary/test.py
Normal file
18
UrbanDictionary/test.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
###
|
||||||
|
# Copyright (c) 2012-2014, spline
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
###
|
||||||
|
|
||||||
|
from supybot.test import *
|
||||||
|
|
||||||
|
class UrbanDictionaryTestCase(PluginTestCase):
|
||||||
|
plugins = ('UrbanDictionary',)
|
||||||
|
|
||||||
|
def testUrbanDictionary(self):
|
||||||
|
conf.supybot.plugins.UrbanDictionary.disableANSI.setValue('True')
|
||||||
|
self.assertRegexp('urbandictionary hello', 'hello ::')
|
||||||
|
self.assertRegexp('urbandictionary spline', 'spline ::')
|
||||||
|
|
||||||
|
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
|
Loading…
x
Reference in New Issue
Block a user