It's (or it has):
- Based on FastAPI
- Feature-rich
- Async-ready
- Around 60% coverage of the LINE API (Contribute)
- Better type hints than linelib (my previous work)
(Not affiliated with The X Corp.)
Code snippets explain more than words. Take a look:
from linex import Client, TextMessageContext
client = Client("channel secret", "channel access token")
@client.event
async def on_ready():
print(f"Logged in as {client.user.name}")
@client.event
async def on_text(ctx: TextMessageContext):
await ctx.reply("Hello, World!")
client.run()
That's it. Say no more to additional setups — they're so annoying!
Currently, there is no documentation for LineX — yet I'm working on it. In the meantime, type hints and code editors are the best documentation sources.
LineX also supports LINE notify, including push message sending and OAuth2.
Here's a simple notify bot:
from linex.ext import Notify
notify = Notify("access token")
notify.notify_sync(
"Hello, World!"
)
Have users that use different languages? Try out the Locale
extension.
First, define a file structure like so:
i18n/
├─ _meta.json
├─ food.json
Inside of _meta.json
, define the available locales:
{
"locales": ["en-US", "zh-Hant"]
}
The locales above are just examples.
Then, create any JSON file with a specific topic (category) under the directory that stores locale strings.
In this case, food.json
would look like:
{
"pizza": {
"en-US": "pizza",
"zh-Hant": "披薩"
},
"describe": {
"en-US": "{food} tastes good!",
"zh-Hant": "{food} 很好吃!"
}
}
The first key (pizza
) and the second one (describe
) stores locale strings with keys defined in the locales
field in _meta.json
.
Additionally, if you add texts surrounded by {}
, it would be considered as an argument that's ready to be passed in. In the above example, "{food} tastes good!"
, implies that the {food}
field would be replaced with a food name later in the Python code.
Finally, define our LINE bot:
from linex import Client
from linex.ext import Locale
client = Client("channel secret", "channel access token")
locale = Locale(
"i18n", # the locale strings directory
sorted_by="categories" # files split by categories
)
@client.event
async def on_text(ctx):
loc = await locale(ctx) # get locale for this user
await ctx.reply(
loc(
"food/describe", # use <category>/<key name> to get
food=loc("food/pizza") # the argument (pizza)
)
)
client.run()
(c) 2023 AWeirdScratcher (AWeirdDev)