diff --git a/mautrix_telegram/db/portal.py b/mautrix_telegram/db/portal.py
index dcc418d8..bae8c76a 100644
--- a/mautrix_telegram/db/portal.py
+++ b/mautrix_telegram/db/portal.py
@@ -15,7 +15,7 @@
# along with this program. If not, see .
from typing import Optional
-from sqlalchemy import Column, Integer, String, Boolean, Text
+from sqlalchemy import Column, Integer, String, Boolean, Text, func
from mautrix.types import RoomID
from mautrix.util.db import Base
@@ -53,4 +53,4 @@ class Portal(Base):
@classmethod
def get_by_username(cls, username: str) -> Optional['Portal']:
- return cls._select_one_or_none(cls.c.username == username)
+ return cls._select_one_or_none(func.lower(cls.c.username) == username)
diff --git a/mautrix_telegram/db/puppet.py b/mautrix_telegram/db/puppet.py
index c647b8d3..46143b98 100644
--- a/mautrix_telegram/db/puppet.py
+++ b/mautrix_telegram/db/puppet.py
@@ -16,7 +16,7 @@
from typing import Optional, Iterable
from sqlalchemy import Column, Integer, String, Boolean
-from sqlalchemy.sql import expression
+from sqlalchemy.sql import expression, func
from mautrix.types import UserID, SyncToken
from mautrix.util.db import Base
@@ -53,7 +53,7 @@ class Puppet(Base):
@classmethod
def get_by_username(cls, username: str) -> Optional['Puppet']:
- return cls._select_one_or_none(cls.c.username == username)
+ return cls._select_one_or_none(func.lowercase(cls.c.username) == username)
@classmethod
def get_by_displayname(cls, displayname: str) -> Optional['Puppet']:
diff --git a/mautrix_telegram/db/user.py b/mautrix_telegram/db/user.py
index 36b9d7b7..81affda2 100644
--- a/mautrix_telegram/db/user.py
+++ b/mautrix_telegram/db/user.py
@@ -15,7 +15,7 @@
# along with this program. If not, see .
from typing import Optional, Iterable, Tuple
-from sqlalchemy import Column, ForeignKey, ForeignKeyConstraint, Integer, String
+from sqlalchemy import Column, ForeignKey, ForeignKeyConstraint, Integer, String, func
from mautrix.types import UserID
from mautrix.util.db import Base
@@ -46,7 +46,7 @@ class User(Base):
@classmethod
def get_by_username(cls, username: str) -> Optional['User']:
- return cls._select_one_or_none(cls.c.tg_username == username)
+ return cls._select_one_or_none(func.lower(cls.c.tg_username) == username)
@property
def contacts(self) -> Iterable[TelegramID]:
diff --git a/mautrix_telegram/portal/base.py b/mautrix_telegram/portal/base.py
index bbea89a1..6dc32b32 100644
--- a/mautrix_telegram/portal/base.py
+++ b/mautrix_telegram/portal/base.py
@@ -354,8 +354,10 @@ class BasePortal(ABC):
if not username:
return None
+ username = username.lower()
+
for _, portal in cls.by_tgid.items():
- if portal.username and portal.username.lower() == username.lower():
+ if portal.username and portal.username.lower() == username:
return portal
dbportal = DBPortal.get_by_username(username)
diff --git a/mautrix_telegram/puppet.py b/mautrix_telegram/puppet.py
index b8f7c24f..cf9c478f 100644
--- a/mautrix_telegram/puppet.py
+++ b/mautrix_telegram/puppet.py
@@ -384,8 +384,10 @@ class Puppet(CustomPuppetMixin):
if not username:
return None
+ username = username.lower()
+
for _, puppet in cls.cache.items():
- if puppet.username and puppet.username.lower() == username.lower():
+ if puppet.username and puppet.username.lower() == username:
return puppet
dbpuppet = DBPuppet.get_by_username(username)
diff --git a/mautrix_telegram/user.py b/mautrix_telegram/user.py
index ea7e2032..3afce211 100644
--- a/mautrix_telegram/user.py
+++ b/mautrix_telegram/user.py
@@ -424,8 +424,10 @@ class User(AbstractUser, BaseUser):
if not username:
return None
+ username = username.lower()
+
for _, user in cls.by_tgid.items():
- if user.username and user.username.lower() == username.lower():
+ if user.username and user.username.lower() == username:
return user
puppet = DBUser.get_by_username(username)