GithubHelp home page GithubHelp logo

malarne / discord_cogs Goto Github PK

View Code? Open in Web Editor NEW
26.0 0.0 25.0 10.25 MB

License: GNU General Public License v3.0

Python 100.00%
cog pillow ranking league profile discord red-discordbot hacktoberfest

discord_cogs's Introduction

discord_cogs V3 ONLY

Install guide:

[p]repo add MalarneCogs https://github.com/Malarne/discord_cogs

then:

[p]cog install MalarneCogs WhatYouWant

Enjoy

account

Updated version of https://github.com/NekoTony/Neko-Cogs account cog I couldn't find that person's discord tag, so couldn't ask him before uploading, but my discord's DMs are open.

Boobs

Updated version of https://github.com/Canule/Mash-Cogs oboobs cog Uploaded with authorization of original author, you can also find that cog on his v3 branch (may not be fully updated)

League

A cog to display information about League of Legends, like your ranking, masteries, ranking of your current game, and history (may be slow, need to be modified) English translation is planned, just have to make the display look better first (it really is awful) NB: This cog may break randomly, for more updated version, use the one under WebLeveler branch, just note it'll work only on dev version until 3.1 version of Red is released

Leveler

Require Pillow (pip3 install Pillow)

The first Leveler cog made for v3 ! Inspired by Stevy's v2 Leveler Basic code made by myself, TrustyJaid helped a lot making things look awesome (he entirely made the [p]profile image, big thumbs up to him) Just use [p]set locale fr-FR if you want to translate the cog into french ! NB: channel whitelist is enabled by default, if you want people to get xp from all your channels, just use [p]levelerset channel whitelist toggle NB2: you can customize your profile using profileset !

discord_cogs's People

Contributors

dezyox avatar jackenmen avatar malarne avatar mikeshardmind avatar obliviatum avatar qenu avatar trustyjaid avatar turnrdev avatar vexed01 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

discord_cogs's Issues

[heist] target char limits results in error

error shows in servers bot-logs when targets are added that exceed character limit, resulting message is as shown
image

This has not resulted in any crashes, but would be a much needed fix.

To reproduce:

  1. make many targets until char limit is reached
  2. get error message and receive error in bot log

Possible solution could be either allowing targets to go through multiple messages, or adding multi-page functionality for the targets.

Translation

Hi.
I have now translated the complete cog to English but i am stuck on one part before i send a PR.
The profile image still has French in it. Im not sure where this image is pulled from.
I assume the .pyc files
I cannot edit these.

Can you advise on how to change the prifle image and then i can push a PR.
Thanks
Magik

image

[Leveler | League] Invalid JSON information file

for Leveler cog:

[29/12/2018 05:11] ERROR installable _process_info_file 149: Invalid JSON information file at path:
/home/flux/bot/cogs/RepoManager/repos/malarne/Leveler/info.json
Traceback (most recent call last):
  File "/home/flux/.local/lib/python3.6/site-packages/redbot/cogs/downloader/installable.py", line 146, in _process_info_file
    info = json.load(f)
  File "/usr/lib/python3.6/json/__init__.py", line 299, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 4 column 20 (char 92)
ERROR:red.downloader:Invalid JSON information file at path:
/home/flux/bot/cogs/RepoManager/repos/malarne/Leveler/info.json
Traceback (most recent call last):
  File "/home/flux/.local/lib/python3.6/site-packages/redbot/cogs/downloader/installable.py", line 146, in _process_info_file
    info = json.load(f)
  File "/usr/lib/python3.6/json/__init__.py", line 299, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 4 column 20 (char 92)

for League cog:

[29/12/2018 08:09] ERROR installable _process_info_file 149: Invalid JSON information file at path:
/home/flux/bot/cogs/RepoManager/repos/malarne/League/info.json
Traceback (most recent call last):
  File "/home/flux/.local/lib/python3.6/site-packages/redbot/cogs/downloader/installable.py", line 146, in _process_info_file
    info = json.load(f)
  File "/usr/lib/python3.6/json/__init__.py", line 299, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 5 column 15 (char 173)

[heist] bailout issues and request

Set bail seems broken since it doesn't really set the bail amount. the bail amount stays the same even after trying to change it.

Also Should add leaderboard to heist.

[account] doesn't have an account at the moment, sorry.

Error ⚠️
_____ doesn't have an account at the moment, sorry.

there is no documentation on how to create and account
ive tried account help, account setup account (myusername)

can i get some clarification on how to setup an account?

Leveler Cog Ideas

Hi Malarne,

I'd have two ideas how we could potentially improve your Leveler cog. I already mentioned this on Discord, its more of a reminder :)

  • Set a default custom background
  • Customising default role

Have a great day/night -- Cheers!

[Leveler] Add a [p]top or [p]rank that displays the Top 10 or 20 Users

Is there a posibility, to add a [p]top or [p]rank to the Cog? so the Users can see, who is the most active. Currently the Rank is displayed in the [p]profile allready, but only your position on that rankinglist.

Thanks in advance, I will and cannot commit code, because I still need to learn, how cogs are build up.

Best Regards!

never Mind, didn't read the Docs.

manage_servers check

Cog won't load on r3.post1 as the check has been changed.

Traceback (most recent call last):
  File "/home/flare/rewrite/lib/python3.7/site-packages/redbot/core/core_commands.py", line 104, in _load
    await bot.load_extension(spec)
  File "/home/flare/rewrite/lib/python3.7/site-packages/redbot/core/bot.py", line 233, in load_extension
    lib = spec.loader.load_module()
  File "<frozen importlib._bootstrap_external>", line 407, in _check_name_wrapper
  File "<frozen importlib._bootstrap_external>", line 907, in load_module
  File "<frozen importlib._bootstrap_external>", line 732, in load_module
  File "<frozen importlib._bootstrap>", line 265, in _load_module_shim
  File "<frozen importlib._bootstrap>", line 696, in _load
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/flare/.local/share/Red-DiscordBot/cogs/CogManager/cogs/Boobs/__init__.py", line 1, in <module>
    from .oboobs import OboobsC
  File "/home/flare/.local/share/Red-DiscordBot/cogs/CogManager/cogs/Boobs/oboobs.py", line 31, in <module>
    class OboobsC(commands.Cog):
  File "/home/flare/.local/share/Red-DiscordBot/cogs/CogManager/cogs/Boobs/oboobs.py", line 104, in OboobsC
    @_oboobs.command(pass_context=True, no_pm=True)
  File "/home/flare/rewrite/lib/python3.7/site-packages/redbot/core/commands/requires.py", line 316, in decorator
    _validate_perms_dict(user_perms)
  File "/home/flare/rewrite/lib/python3.7/site-packages/redbot/core/commands/requires.py", line 703, in _validate_perms_dict
    raise TypeError(f"Unknown permission name '{perm}'")
TypeError: Unknown permission name 'manage_server'

Roles not being issued.

Roles aren't being given to people leveling up. Yes, the bot has full administration powers. I'm wondering if the roles having "(lvl 10+)" in the names would break it, unsure.

The way they were added was
!levelerset roles add 10 @mentionedrole

[Heist] wait_for : TimeoutError

This:

response = await self.bot.wait_for('MESSAGE', timeout=15, check=lambda x: x.author == author)

if response is None:
    await ctx.send("You took too long. canceling transaction.")
    return

Should be written like this:

try:
    response = await self.bot.wait_for("message", timeout=15, check=lambda x: x.author == author)
except asyncio.TimeoutError:
    await ctx.send("You took too long. canceling transaction.")
    return

[Heist] Feature/Design Suggestion

What if you made is so when you start a heist you can react to the message (with set reaction from the bot) to join and when members join it updates the initial message instead. Or just don't update who joins with increased crew amount or names, but can just see how many has reacted instead. Could use this as an option/alternative too of course. If people rather have the original look/design.
And perhaps make an option to use embeds for the heist results.

Think of it a bit similar to what Adventure has. Then it won't flood the channel with everyone using the heist play command. Just a bit cleaner with that part.

[Leveler] IndexError: string index out of range

Hi,

as we discussed in #support-othercogs, this is the traceback for Leveler cog:

[29/12/2018 02:19] ERROR events on_error 188: Exception in message
Traceback (most recent call last):
  File "/home/flux/.local/lib/python3.6/site-packages/discord/client.py", line 225, in _run_event
    await coro(*args, **kwargs)
  File "/home/flux/bot/cogs/CogManager/cogs/Leveler/leveler.py", line 291, in on_message
    if message.content[0] in await self.bot.get_prefix(message):
IndexError: string index out of range
ERROR:red.sentry:Exception in message
Traceback (most recent call last):
  File "/home/flux/.local/lib/python3.6/site-packages/discord/client.py", line 225, in _run_event
    await coro(*args, **kwargs)
  File "/home/flux/bot/cogs/CogManager/cogs/Leveler/leveler.py", line 291, in on_message
    if message.content[0] in await self.bot.get_prefix(message):
IndexError: string index out of range

screenshot

Request for custom account cog (similiar to your account cog)

Hey i have posted a bounty on cogboard and was told i could request here aswell.

Would you be willing to create a private cog really similar to your account cog. just different fields?
I am willing to pay for it.

Please let me know here or via discord please

My Discord: Toast#7073

Thanks
Toast

[oBoobs] request

Since my Bot runs on 22 Servers by now with nearly 2000 Members, I'm running Toby's errorlogs cog.

Lately there is this one curious User, trying to get boobs and ass with DMing the Bot. And everytime I get a new errorlog sent to my Server :D

Could you make it so, that in DM there is a "this command does not work in DM" response? Or something else, all I care so far is to stop getting the errorlogs xD

Unknown Error

Upon running !profile now, I'm seeming to get an error. Happened after I decided to release the feature to my discord.

4|NexusBot  | Traceback (most recent call last):
4|NexusBot  |   File "/usr/local/lib/python3.7/dist-packages/discord/ext/commands/core.py", line 79, in wrapped
4|NexusBot  |     ret = await coro(*args, **kwargs)
4|NexusBot  |   File "/home/nexusnation/NexusBot/cogs/CogManager/cogs/leveler/leveler.py", line 292, in profile
4|NexusBot  |     img = await asyncio.wait_for(task, timeout=60)
4|NexusBot  |   File "/usr/lib/python3.7/asyncio/tasks.py", line 442, in wait_for
4|NexusBot  |     return fut.result()
4|NexusBot  |   File "/usr/lib/python3.7/concurrent/futures/thread.py", line 57, in run
4|NexusBot  |     result = self.fn(*self.args, **self.kwargs)
4|NexusBot  |   File "/home/nexusnation/NexusBot/cogs/CogManager/cogs/leveler/leveler.py", line 217, in make_full_profile
4|NexusBot  |     for line in textwrap.wrap(desc, width=20):
4|NexusBot  |   File "/usr/lib/python3.7/textwrap.py", line 379, in wrap
4|NexusBot  |     return w.wrap(text)
4|NexusBot  |   File "/usr/lib/python3.7/textwrap.py", line 351, in wrap
4|NexusBot  |     chunks = self._split_chunks(text)
4|NexusBot  |   File "/usr/lib/python3.7/textwrap.py", line 337, in _split_chunks
4|NexusBot  |     text = self._munge_whitespace(text)
4|NexusBot  |   File "/usr/lib/python3.7/textwrap.py", line 154, in _munge_whitespace
4|NexusBot  |     text = text.expandtabs(self.tabsize)
4|NexusBot  | AttributeError: 'NoneType' object has no attribute 'expandtabs'

leveler error when loading

when i run [p]load leveler i get
i did install Pillow 5.3.0
Traceback (most recent call last): File "/home/pi/.pyenv/versions/redbot/lib/python3.7/site-packages/redbot/core/core_commands.py", line 106, in _load await bot.load_extension(spec) File "/home/pi/.pyenv/versions/redbot/lib/python3.7/site-packages/redbot/core/bot.py", line 302, in load_extension lib.setup(self) File "/home/pi/.local/share/Red-DiscordBot/cogs/CogManager/cogs/Leveler/__init__.py", line 7, in setup bot.add_cog(n) File "/home/pi/.pyenv/versions/redbot/lib/python3.7/site-packages/redbot/core/bot.py", line 429, in add_cog super().add_cog(cog) File "/home/pi/.pyenv/versions/redbot/lib/python3.7/site-packages/discord/ext/commands/bot.py", line 482, in add_cog cog = cog._inject(self) File "/home/pi/.pyenv/versions/redbot/lib/python3.7/site-packages/discord/ext/commands/cog.py", line 378, in _inject bot.remove_command(to_undo) File "/home/pi/.pyenv/versions/redbot/lib/python3.7/site-packages/redbot/core/bot.py", line 464, in remove_command command.requires.reset() AttributeError: 'NoneType' object has no attribute 'requires'

[Request] Leveler System

Hello I have recently started using your Leveler System and am loving it. I changed up the design myself but it works great. One thing I've noticed with the XP system though is that instead of the normal once you level your xp goes back to 0 and you climb to the next total you keep your previous XP and continue to the next max XP needed.

Is there any way you could make it at each level the XP reset to 0 and then you climb to the max XP needed for that level?

Pillow Error

Traceback (most recent call last):
  File "c:\program files\python38\lib\site-packages\redbot\core\core_commands.py", line 173, in _load
    await bot.load_extension(spec)
  File "c:\program files\python38\lib\site-packages\redbot\core\bot.py", line 1356, in load_extension
    lib = spec.loader.load_module()
  File "<frozen importlib._bootstrap_external>", line 462, in _check_name_wrapper
  File "<frozen importlib._bootstrap_external>", line 962, in load_module
  File "<frozen importlib._bootstrap_external>", line 787, in load_module
  File "<frozen importlib._bootstrap>", line 265, in _load_module_shim
  File "<frozen importlib._bootstrap>", line 702, in _load
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\Administrator\AppData\Local\Red-DiscordBot\Red-DiscordBot\data\PCMR\cogs\CogManager\cogs\Leveler\__init__.py", line 1, in <module>
    from .leveler import Leveler
  File "C:\Users\Administrator\AppData\Local\Red-DiscordBot\Red-DiscordBot\data\PCMR\cogs\CogManager\cogs\Leveler\leveler.py", line 11, in <module>
    from PIL import Image, ImageDraw, ImageFont
  File "C:\Users\Administrator\AppData\Local\Red-DiscordBot\Red-DiscordBot\data\PCMR\cogs\Downloader\lib\PIL\Image.py", line 117, in <module>
    raise ImportError(
ImportError: The _imaging extension was built for another version of Pillow or PIL:
Core version: 8.3.1
Pillow version: 8.1.0```

Leveler work with Pillow 7.1.1

Hi,
I just try to install Pillow 5.3.0 but I have to many errors.
And for for test I've install Pillow without version number and it's the 7.1.1 was been install.
And it's work for the moment.

League 'accountId'

Traceback (most recent call last):
  File "/home/X/redenv/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "/home/X/.local/share/Red-DiscordBot/data/X/cogs/CogManager/cogs/League/league.py", line 152, in history
    histo = await self.stats.get_history(count, region, summoner)
  File "/home/X/.local/share/Red-DiscordBot/data/X/cogs/CogManager/cogs/League/neeko.py", line 220, in get_history
    sumid = await self.get_account_id(region, summoner)
  File "/home/X/.local/share/Red-DiscordBot/data/X/cogs/CogManager/cogs/League/neeko.py", line 71, in get_account_id
    return js["accountId"]
KeyError: 'accountId'```

How do I set one?

heist errors: AttributeError: 'NoneType' object has no attribute 'display_name'

Upon starting the RedBot v3 instance I get this msg:

[2020-10-31 12:46:08] [WARNING] red: Owner with ID 766009006359183390 is missing in user cache, ignoring owner notification destination.

This is the error when trying to start a Heist using !heist play
It used to work but no longer. Any ideas how I can fix this?

[2020-10-31 12:47:09] [WARNING] red: Detected significant difference (7198 seconds) in system clock to discord's clock. Any time sensitive code may fail.
[2020-10-31 12:49:15] [ERROR] red: Exception in command 'heist play'
Traceback (most recent call last):
File "c:\users\virtualbox1\redenv\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "C:\Users\VirtualBox1\AppData\Local\Red-DiscordBot\Red-DiscordBot\data\LouBot\cogs\CogManager\cogs\heist\heist.py", line 501, in _play_heist
await self.heist_game(ctx, guild, t_heist, t_crew, t_vault)
File "C:\Users\VirtualBox1\AppData\Local\Red-DiscordBot\Red-DiscordBot\data\LouBot\cogs\CogManager\cogs\heist\heist.py", line 519, in heist_game
results = await self.thief.game_outcomes(guild, players, target)
File "C:\Users\VirtualBox1\AppData\Local\Red-DiscordBot\Red-DiscordBot\data\LouBot\cogs\CogManager\cogs\heist\thief.py", line 322, in game_outcomes
dropout_msg = (bad_thing[0] + "\n{0} dropped out of the game.").format(escape(player.display_name, formatting=True))
AttributeError: 'NoneType' object has no attribute 'display_name'

Weird heist time remaining.

Hey. I have noticed some weird time remaining in jail with the heists which are more than the sentences. Any fix to this???
image

Failed to load account cog

Is the account cog updated to version 3.5 yet? I am getting this error currently when attempting to load the cog.

ERROR [red] Package loading failed ┌───────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────┐ │ C:\Users\Jared\redenv\Lib\site-packages\redbot\core\core_commands.py:188 in _load │ │ > 188 await bot.load_extension(spec) │ │ C:\Users\Jared\redenv\Lib\site-packages\redbot\core\bot.py:1686 in load_extension │ │ > 1686 await lib.setup(self) │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ TypeError: object NoneType can't be used in 'await' expression [03:40:32] WARNING [py.warnings] C:\Users\Jared\AppData\Local\Red-DiscordBot\Red-DiscordBot\data\auxbot\cogs\CogManager\cogs\account\__init__.py:4: RuntimeWarning: coroutine 'Red.add_cog' was never awaited bot.add_cog(Account(bot))

Leveler Cog Suggestions

personally i prefer the older version of leveler since it did not round off corners and cut out text like the newer one does. So i had a couple of suggestions that i think would make this cog better. (only suggestions of course, not really complaining.)

  1. Increase size of profile - instead of being a default 340x390, revert back to a square image with increased size. Such as 780x780 or 920x920 for example.
  2. correct the new issue that appears when the profile is drawn and info gets cut off the screen.
  3. Adjust Bottom of profile with Rank, Level and Balance. The credits balance once it gets too long gets squashed and runs off the profile image. Possibly check if member has over 10,000 credits and display it as 10.4K instead of as 10400.

Again just three small suggestions that i think would make this cog 100 times better. :)

[Heist/Feature Request] Targets and Stats

Be able to create multiple targets within the same group, such as two targets with a group size of 4. When the game starts, a random target from that group would be selected.

For [p]heist stats It would be a nice addition to include your total winnings in it. I love the cog though, one of my favourites.

Profile image displayed empty

If a user types [p]profile and they have not registered, a blank profile image is shown.

image

If a user is registered, then the infromation is displayed in the img.

image

Adjustments:

There should be a check added to check if the user is Registered before posting the profile image.
If they are not registered, post reply with "Please register with [p]register to view your profile and gain XP"

[Heist] Bailout not working

Bailout someone else is not working, you pay the money but the person is not bailed.
More people have the same problem.

image
image

[Leveler] list index out of range

Hi, seeing these tracebacks again in my journalctl logs after recent cog update:

[08/01/2019 12:55] ERROR events on_error 188: Exception in message
Traceback (most recent call last):
  File "/home/flux/.local/lib/python3.6/site-packages/discord/client.py", line 225, in _run_event
    await coro(*args, **kwargs)
  File "/home/flux/bot/cogs/CogManager/cogs/Leveler/leveler.py", line 314, in on_message
    grade = message.guild.get_role(roles[ln-1])
IndexError: list index out of range

I'm on v3 rc2.

Specify a license

You should put a LICENSE file in your repo to tell others how they can use your code. If you don't, this code falls under copyright law.

I personally recommend AGPLv3 since it'll be used over networks and encourages only free software but feel free to see at : https://choosealicense.com/ if you don't like AGPLv3.

[Question] User Database Reset

Is there anyway to reset the userdatabase to put everyone back to no exp and no levels?

P.S. I got everything working for resetting exp for each level thanks again.

[heist] death timer not being applied

We have a 5 minute cooldown applied when players die in a heist, but when the heist is over they are immediately able to revive themselves without having to wait the 5 minute cooldown. No one who dies in a heist has to go through the timer. Everyone can instantly revive.

image

image

Possible solution could be to relook how settings are changed/updated.

[Leveler] Remove last role

Hello,

is there an ability to remove the last level role you had? For example If I get to level 5, I get the level 5+ role but not the level 1+ role revoked. Has it something to do with the defaultroles, I really don't know 👍

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.