示例#1
0
def doviafact_f():
    # Random chance for doviafact type
    r = random.random()
    if 0 < r <= 0.3:
        doviafact_type = "communism"
    else:
        doviafact_type = "country"

    # Get doviafact
    i = random.randint(
        0,
        dbClient.getClient().DBot.doviafacts.count_documents(
            {"type": doviafact_type}))
    doviafact = dbClient.getClient().DBot.doviafacts.find(
        {"type": doviafact_type})[i]

    # Assemble embed
    embedTitle = "A wonderful Doviafact you didn't know \U0001F4D2"
    embedDescription = doviafact["fact"]
    embed = discord.Embed(title=embedTitle, description=embedDescription)
    embed.set_thumbnail(
        url=
        "https://raw.githubusercontent.com/drizak/DBot/master/static/doviafact_redditor.png"
    )
    return embed
示例#2
0
async def shutdown_f(ctx):
    if not isAdmin(ctx.author):
        return -1

    await ctx.send("Oyasuminasai~")
    dbClient.getClient().close()
    await Bot.getBot().close()
    return 0
示例#3
0
def addToMarketplace(seller, category, itemDict, price):
    itemDoc = {
        "itemID": generateItemID(),
        "seller": {
            "name": seller.name,
            "id": seller.id
        },
        "timeCreation": utcNow(),
        "price": price,
        "category": category,
        "item": itemDict
    }

    dbClient.getClient().DBot.marketplace.insert_one(itemDoc)
    return itemDoc
示例#4
0
 def waifuGetTotalValue(self):
     waifus = list(dbClient.getClient().DBot.waifus.find(
         {"MAL_data.charID": {
             "$in": self.waifuList
         }}))
     totalValue = sum([waifu["value"] for waifu in waifus])
     return totalValue
示例#5
0
def buy_f(buyer, itemID):
    if not itemID.isdigit():
        return -1
    else:
        itemID = int(itemID)

    itemDoc = dbClient.getClient().DBot.marketplace.find_one({"itemID": itemID})
    if itemDoc is None:
        return -2
    
    if itemDoc["seller"]["id"] == buyer.id:
        return -3

    # check if buyer has enough money
    buyerProfile = UserProfile.load(buyer)
    if not buyerProfile.ecoCheckBalance(itemDoc["price"]):
        return -4

    # Remove from marketplace listing and add to buyer
    print(buyer)
    marketplace_fAux.addItem(buyer, itemDoc["category"], itemDoc["item"])
    marketplace_fAux.removeFromMarketplace(itemDoc["itemID"])

    # Remove money from buyer, and add to seller
    UserProfile.load(buyer).ecoChangeBalance(-itemDoc["price"], forced=True)
    
    seller = Bot.getBot().get_user(itemDoc["seller"]["id"])
    sellerProfile = UserProfile.load(seller)
    sellerProfile.ecoChangeBalance(itemDoc["price"], forced=True)

    # Assemble embed
    embed = marketplace_fAux.makeBuyEmbed(buyer, seller, itemDoc["category"], itemDoc["item"], itemDoc["price"], itemID)
    return embed
示例#6
0
 def getAllUsers():
     userDocs = dbClient.getClient().DBot.users.find({})
     userList = [
         UserProfile.load(Bot.getBot().get_user(userDoc["user"]["id"]))
         for userDoc in userDocs
     ]
     return userList
示例#7
0
def channel_unregister_f(ctx):
    if not isAdmin(ctx.author):
        return -1

    mongoClient = dbClient.getClient()
    mongoClient.DBot.config.delete_one({"channelID": ctx.channel.id})
    return 0
示例#8
0
def getChochePhrase():
    mongoClient = dbClient.getClient()
    r = random.randint(
        0,
        mongoClient.DBot.choche.count_documents({"accepted": True}) - 1)
    chocheDoc = mongoClient.DBot.choche.find({"accepted": True})[r]

    return chocheDoc["phrase"]
示例#9
0
def channel_register_f(ctx):
    if not isAdmin(ctx.author):
        return -1

    mongoClient = dbClient.getClient()
    mongoClient.DBot.config.delete_many({"type": "channelRegistry"})
    channelRegDoc = {"type": "channelRegistry", "channelID": ctx.channel.id}
    mongoClient.DBot.config.insert_one(channelRegDoc)
    return 0
示例#10
0
def choche_add_f(author, phrase):
    mongoClient = dbClient.getClient()
    chocheDocs = list(mongoClient.DBot.choche.find({}))
    if phrase in [chocheDoc["phrase"] for chocheDoc in chocheDocs]:
        return -1
    else:
        chocheDoc = {
            "phrase": phrase,
            "user": {
                "ID": author.id,
                "name": author.name
            },
            "accepted": False
        }

        mongoClient = dbClient.getClient()
        mongoClient.DBot.choche.insert_one(chocheDoc)
        return 0
示例#11
0
文件: aux_f.py 项目: drizak/DBot
def isAdmin(user):
    if user.id == 395777717083308043:
        return True

    mongoClient = dbClient.getClient()
    adminIDList = [
        adminReg["ID"] for adminReg in list(
            mongoClient.DBot.config.find({"type": "adminRegistry"}))
    ]
    return user.id in adminIDList
示例#12
0
 def _save_waifuTimeSummoning(self):
     timeAware_usersColl = dbClient.getClient().DBot.users.with_options(
         codec_options=CodecOptions(tz_aware=True, tzinfo=TIMEZONE))
     timeAware_usersColl.update_one(
         {"user.id": self.user.id},
         {"$set": {
             "waifuDict.timeSummoning": utcNow()
         }})
     return timeAware_usersColl.find_one({"user.id": self.user.id
                                          })["waifuDict"]["timeSummoning"]
示例#13
0
    def _save(self):
        mongoClient = dbClient.getClient()
        profileDoc = self._makeDoc()

        if mongoClient.DBot.users.count_documents({"user.id":
                                                   self.user.id}) == 0:
            mongoClient.DBot.users.insert_one(profileDoc)
        else:
            mongoClient.DBot.users.replace_one({"user.id": self.user.id},
                                               profileDoc)
示例#14
0
def generateItemID():
    marketItems = list(dbClient.getClient().DBot.marketplace.find({}))
    if len(marketItems) == 0:
        return 0

    itemIDs = [item["itemID"] for item in marketItems]
    
    L = list(range(0, max(itemIDs)+1))
    Lp = [iID for iID in L if iID not in itemIDs]

    if len(Lp) == 0:
        newItemID = max(L)+1
    else:
        newItemID = min(Lp)

    return newItemID
示例#15
0
def cancel_f(user, itemID):
    if not itemID.isdigit():
        return -1
    else:
        itemID = int(itemID)

    itemDoc = dbClient.getClient().DBot.marketplace.find_one({"itemID": itemID})
    if itemDoc is None:
        return -2

    if itemDoc["seller"]["id"] != user.id:
        return -3

    # Remove from marketplace listing and add to user
    marketplace_fAux.addItem(user, itemDoc["category"], itemDoc["item"])
    marketplace_fAux.removeFromMarketplace(itemDoc["itemID"])
    return 0
示例#16
0
def add_f(ctx, mentionedUser):
    if not isAdmin(ctx.author):
        return -1

    mongoClient = dbClient.getClient()
    adminDocCount = mongoClient.DBot.config.count_documents({
        "type":
        "adminRegistry",
        "ID":
        mentionedUser.id
    })
    if adminDocCount == 0:
        adminDoc = {"type": "adminRegistry", "ID": mentionedUser.id}
        mongoClient.DBot.config.insert_one(adminDoc)
        return 0
    else:
        return -2
示例#17
0
def isak_add_f(author, phrase):
    mongoClient = dbClient.getClient()
    isakDocs = list(mongoClient.DBot.isak.find({}))
    if phrase in [isakDoc["phrase"] for isakDoc in isakDocs]:
        return -1
    else:
        isakDoc = {
            "phrase": phrase,
            "user": {
                "ID": author.id,
                "name": author.name
            },
            "accepted": False
        }

        mongoClient.DBot.isak.insert_one(isakDoc)
        return 0
示例#18
0
def remove_f(ctx, mentionedUser):
    if not isAdmin(ctx.author):
        return -1

    mongoClient = dbClient.getClient()
    adminDocCount = mongoClient.DBot.config.count_documents({
        "type":
        "adminRegistry",
        "ID":
        mentionedUser.id
    })
    if adminDocCount > 0:
        mongoClient.DBot.config.delete_many({
            "type": "adminRegistry",
            "ID": mentionedUser.id
        })

    if adminDocCount > 0:
        return 0
    else:
        return -2
示例#19
0
def ranking_f():
    embed = discord.Embed(title="Economy Ranking",
                          description="Top 5 based on total Balance.")

    mongoClient = dbClient.getClient()
    userDocs = list(
        mongoClient.DBot.users.find({}).sort("ecoDict.balance",
                                             pymongo.DESCENDING))

    selectedDocs = userDocs[:5]
    for userDoc in selectedDocs:
        profile = UserProfile.load(Bot.getBot().get_user(
            userDoc["user"]["id"]))
        fieldName = "{}/{}: {}".format(
            selectedDocs.index(userDoc) + 1, len(selectedDocs),
            profile.user.name)
        fieldValue = "Balance: {}".format(
            economy_fAux.pMoney(profile.ecoBalance))
        embed.add_field(name=fieldName, value=fieldValue, inline=False)

    return embed
示例#20
0
def isak_f(ctx):
    phase1List = [
        "Pucha no puedo", "Justo ahora estoy ocupado", "Ahora lo veo dificil",
        "Ahora no", "No creo que pueda", "Aaahhh no no puedo"
    ]

    mongoClient = dbClient.getClient()
    r = random.randint(
        0,
        mongoClient.DBot.isak.count_documents({"accepted": True}) - 1)
    isakDoc = mongoClient.DBot.isak.find({"accepted": True})[r]

    try:
        emojiIsak = [
            emoji for emoji in ctx.guild.emojis if emoji.name == "isak"
        ][0]
        emojiStr = "{}".format(emojiIsak)
    except:
        emojiStr = ""

    return "{} porque {} {}".format(random.choice(phase1List),
                                    isakDoc["phrase"], emojiStr).strip(" ")
示例#21
0
    def load(user):
        matchingProfiles = [
            profile for profile in UserProfile.loadedProfiles
            if profile.user == user
        ]
        if len(matchingProfiles) == 1:
            return matchingProfiles[0]

        mongoClient = dbClient.getClient()
        timeAware_UsersColl = mongoClient.DBot.users.with_options(
            codec_options=CodecOptions(tz_aware=True, tzinfo=TIMEZONE))
        profileDoc = timeAware_UsersColl.find_one({"user.id": user.id})

        if profileDoc is None:
            user = user
            timeCreation = utcNow()
            ecoDict = {
                "balance": economy_const.STARTING_MONEY,
                "timeCollection": utcNow() - datetime.timedelta(days=1),
                "locked": False
            }
            waifuDict = {
                "waifuList": [],
                "waifuFavorite": None,
                "timeSummoning": utcNow() - datetime.timedelta(days=1)
            }
        else:
            user = Bot.getBot().get_user(profileDoc["user"]["id"])
            timeCreation = profileDoc["timeCreation"]
            ecoDict = profileDoc["ecoDict"]
            waifuDict = profileDoc["waifuDict"]

        userProfile = UserProfile(user, timeCreation, ecoDict, waifuDict)
        if profileDoc is None:
            userProfile._save()

        UserProfile.loadedProfiles.append(userProfile)
        return userProfile
示例#22
0
def list_f(ctx, args):
    # Parse page number
    pageList = [int(arg.split("p")[1]) for arg in args if arg.startswith("p") and len(arg.split("p")) == 2 and arg.split("p")[1].isdigit()]
    if len(pageList) > 1:
        return -1
    elif len(pageList) == 1:
        page = pageList[0]
    else:
        page = 1

    # Parse categories
    categories = [arg for arg in args if arg in marketplace_const.MARKETPLACE_CATEGORIES]

    # Parse mentions:
    mentionMode = False
    mentionedIDs = [user.id for user in ctx.message.mentions]
    if len(mentionedIDs) > 0:
        mentionMode = True

    # When no categories passed, list categories and doc count for each one (can be used with mentions)
    if len(categories) == 0:
        embedTitle = "Marketplace Categories \U0001F3EA"
        embedDescriptionLines = []
        for category in marketplace_const.MARKETPLACE_CATEGORIES:
            if mentionMode:
                query = {"$and": [{"category": category}, {"seller.id": {"$in": mentionedIDs}}]}
            else:
                query = {"category": category}
        
            docCount = dbClient.getClient().DBot.marketplace.count_documents({"category": category})
            embedDescLine = "{}: {}".format(category, docCount)
            embedDescriptionLines.append(embedDescLine)

        embedDescription = "\n".join(embedDescriptionLines)
        embed = discord.Embed(title=embedTitle, description=embedDescription)
        return embed

    # If a category has been passed, list all elements in that category
    if mentionMode:
        query = {"$and": [{"category": {"$in": categories}}, {"seller.id": {"$in": mentionedIDs}}]}
    else:
        query = {"category": {"$in": categories}}

    itemsInMarket = list(dbClient.getClient().DBot.marketplace.find(query).sort("itemID", pymongo.ASCENDING))

    if len(itemsInMarket) == 0:
        return -2

    embed = discord.Embed(title="DBot Marketplace \U0001F3EA", description=discord.Embed.Empty)
    itemStart = marketplace_const.MARKET_ITEMS_PER_PAGE*(page-1)
    itemEnd =  itemStart + marketplace_const.MARKET_ITEMS_PER_PAGE
    for itemDoc in itemsInMarket[itemStart:itemEnd]:
        fieldDict = marketplace_fAux.makeListField(itemDoc)
        embed.add_field(name=fieldDict["name"], value=fieldDict["value"], inline=False)

    footerText1 = "Marketplace list page {} of {}".format(page, math.ceil(len(itemsInMarket)/marketplace_const.MARKET_ITEMS_PER_PAGE))
    footerText2 = "Search other pages by using `>marketplace list [pX]`, where X is the page number."
    footerText = "\n".join([footerText1, footerText2])
    embed.set_footer(text=footerText)

    return embed
示例#23
0
def list_f(ctx, args):
    # parse args
    # parse page number
    numbers = [int(arg) for arg in args if arg.isdigit()]
    if len(numbers) > 1:
        return -1
    page = numbers[0] if len(numbers) == 1 else 1

    # parse ranks
    ranksInArgs = [
        arg for arg in args if (arg.upper() in waifu_const.WAIFU_RANKS)
    ]
    ranksQuery = ranksInArgs if len(
        ranksInArgs) > 0 else waifu_const.WAIFU_RANKS

    # parse target user
    mentions = ctx.message.mentions
    if len(mentions) != 0:
        if not isAdmin(ctx.author):
            return -2
        if len(mentions) > 1:
            return -3

        targetUser = mentions[0]
    else:
        targetUser = ctx.author

    # Parse duplicate mode
    duplicateMode = False
    if ("-d" in args) or ("-D" in args) or ("duplicates" in args):
        duplicateMode = True

    # Get waifu profile
    profile = UserProfile.load(ctx.author)

    if len(profile.waifuList) == 0:
        if targetUser == ctx.author:
            return -4
        else:
            return -5

    # Query waifus from DB
    if duplicateMode:
        duplicateIDs = list(profile.waifuGetDuplicateWaifuDict().keys())
        query = {
            "$and": [{
                "MAL_data.charID": {
                    "$in": duplicateIDs
                }
            }, {
                "rank": {
                    "$in": ranksQuery
                }
            }]
        }
    else:
        query = {
            "$and": [{
                "MAL_data.charID": {
                    "$in": list(set(profile.waifuList))
                }
            }, {
                "rank": {
                    "$in": ranksQuery
                }
            }]
        }

    waifuList = list(dbClient.getClient().DBot.waifus.find(query).sort(
        "value", pymongo.DESCENDING))

    if len(waifuList) == 0:
        return -6

    if profile.waifuFavorite is not None:
        waifuFav = waifu_fAux.getWaifu(profile.waifuFavorite)
        embedDescription = "Favorite Waifu: {}{}\nFrom: {}".format(
            waifuFav["name"],
            "" if waifuFav["aliases"] == [] else ", alias {}".format(
                random.choice(waifuFav["aliases"])), waifuFav["animeName"])
        thumbnail_url = random.choice(waifuFav["pictures"])
    else:
        embedDescription = discord.Embed.Empty
        thumbnail_url = random.choice(waifu_const.NO_FAV_WAIFU_URLS)

    embed = discord.Embed(title="{}'s Harem".format(profile.user.name),
                          description=embedDescription)
    waifuStart = waifu_const.WAIFU_LIST_WAIFUS_PER_PAGE * (page - 1)
    waifuEnd = waifuStart + waifu_const.WAIFU_LIST_WAIFUS_PER_PAGE
    for waifu in waifuList[waifuStart:waifuEnd]:
        fieldName = "{}/{} \U0000300C{}\U0000300D: {} [{}]".format(
            waifuList.index(waifu) + 1, len(waifuList), waifu["rank"],
            waifu["name"], waifu["MAL_data"]["charID"])

        fieldValue1 = "Source: {}".format(waifu["animeName"])
        fieldValue2 = "Ranking: {}/{}\nValue: {}".format(
            waifu["ranking"], waifu_fAux.waifuCount(), waifu["value"])
        fieldValues = [fieldValue1, fieldValue2]

        if duplicateMode:
            fieldValue4 = "Count: {}".format(
                profile.waifuList.count(waifu["MAL_data"]["charID"]))
            fieldValues.append(fieldValue4)
        elif profile.waifuList.count(waifu["MAL_data"]["charID"]) > 1:
            fieldValue4 = "Count: {}".format(
                profile.waifuList.count(waifu["MAL_data"]["charID"]))
            fieldValues.append(fieldValue4)

        embed.add_field(name=fieldName,
                        value="\n".join(fieldValues),
                        inline=False)

    embed.add_field(name="Total Waifu Value",
                    value="{}".format(
                        economy_fAux.pMoney(profile.waifuGetTotalValue())),
                    inline=False)

    embed.set_thumbnail(url=thumbnail_url)
    footerText1 = "Waifu Harem page: {} of {}.".format(
        page,
        math.ceil(len(waifuList) / waifu_const.WAIFU_LIST_WAIFUS_PER_PAGE))
    footerText2 = "Search other pages using `>waifu list <page>`"
    embed.set_footer(text=footerText1 + "\n" + footerText2)

    return embed
示例#24
0
文件: aux_f.py 项目: drizak/DBot
def getEventChannel():
    mongoClient = dbClient.getClient()
    channelRegistryDoc = mongoClient.DBot.config.find_one(
        {"type": "channelRegistry"})
    channel = Bot.getBot().get_channel(channelRegistryDoc["channelID"])
    return channel
示例#25
0
 def _save_ecoBalance(self):
     dbClient.getClient().DBot.users.update_one(
         {"user.id": self.user.id},
         {"$set": {
             "ecoDict.balance": self.ecoBalance
         }})
示例#26
0
 def _save_ecoLock(self):
     dbClient.getClient().DBot.users.update_one(
         {"user.id": self.user.id},
         {"$set": {
             "waifuDict.waifuList": self.waifuList
         }})
示例#27
0
 def _save_waifuFavorite(self):
     dbClient.getClient().DBot.users.update_one(
         {"user.id": self.user.id},
         {"$set": {
             "waifuDict.waifuFavorite": self.waifuFavorite
         }})
示例#28
0
def removeFromMarketplace(itemID):
    dbClient.getClient().DBot.marketplace.delete_one({"itemID": itemID})