It's time to revive BeAIM - Retro messaging in 2024

Do you also miss the good old instant messengers from the good old times,when the internet was a lot smaller,programs were more lightweight and good UX was still a thing?
I absolutely do,so I decided to pick BeAIM as my new toy project.
For the younger generation here: AIM was the Whatsapp of the 90s and the early 2000s,but different and optimized for computers rather than phones.
Screenshot
The last commits at the BeAIM repository were 6 years ago,and that was only build fixes,no new features.
With the current GGC 13,it didnā€™t compile anymore,after fixing that,it would crash in different situations and when it didnā€™t crash,it also didnā€™t connect to the server at all.
I already fixed this,resulting in a pretty stable app that provides basic chat functionality in a cool retro way.
In the future,I plan to add support for system colors (dark mode),make use of the LocaleKit to automatically use the system language rather than a custom translation class,add buttons to format your own chat messages (receiving formatted text from Windows clients already works) and laterā€¦much laterā€¦maybe voice calls?
I know the Windows clients theoretically support calls,but I didnā€™t even get it to work between two Windows computers,and itā€™s probably a lot of work to implement,but would be a pretty cool feature also.
You can get the source from Codeberg: nikisoft/BeAIM: AIM chat client for Haiku - Codeberg.org
There are no precompiled binaries for now as itā€™s a really early version,but compiling and running is easy:

git clone https://codeberg.org/nikisoft/BeAIM
cd BeAIM
make
BeAIM/BeAIM

Feel free to text me if you need someone to try it with,my username is nipos on AIM as well (on the preconfigured iwarg.ddns.net server).
Let me know what you think about the project :slight_smile:

12 Likes

Hello! Great initiative :grinning:

I tried to compile it under Haiku 32 bit, but I got into the following error:

ā€˜ā€™ā€™

> g++ -c Interface/TrayIcon.cpp -iquote./  -iquote./  -iquoteInterface/  -iquoteManagers/  -iquoteMisc/  -iquoteNetwork/  -iquoteProtocol/  -iquoteXML/  -iquoteobjects.x86-cc13-release/  -iquoteHeaders   -O1   -DBEAIM_BONE -fpermissive -o "objects.x86-cc13-release/TrayIcon.o"
> Interface/TrayIcon.cpp: In member function 'virtual void TrayIcon::MouseDown(BPoint)':
> Interface/TrayIcon.cpp:108:46: error: no matching function for call to 'FindInt32(const char [8], int*)'
>   108 |         Window()->CurrentMessage()->FindInt32("buttons", (int*)&mouseButtons);
>       |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> In file included from /boot/system/develop/headers/os/support/Archivable.h:10,
>                  from /boot/system/develop/headers/os/app/Handler.h:12,
>                  from /boot/system/develop/headers/os/interface/View.h:12,
>                  from /boot/system/develop/headers/os/interface/Menu.h:11,
>                  from /boot/system/develop/headers/os/interface/PopUpMenu.h:9,
>                  from Interface/TrayIcon.cpp:2:
> /boot/system/develop/headers/os/app/Message.h:226:57: note: candidate: 'status_t BMessage::FindInt32(const char*, int32*) const' (near match)
>   226 |                         status_t                        FindInt32(const char* name, int32* value) const;
>       |                                                         ^~~~~~~~~
> /boot/system/develop/headers/os/app/Message.h:226:57: note:   conversion of argument 2 would be ill-formed:
> Interface/TrayIcon.cpp:108:58: warning: invalid conversion from 'int*' to 'int32*' {aka 'long int*'} [-fpermissive]
>   108 |         Window()->CurrentMessage()->FindInt32("buttons", (int*)&mouseButtons);
>       |                                                          ^~~~~~~~~~~~~~~~~~~
>       |                                                          |
>       |                                                          int*
> /boot/system/develop/headers/os/app/Message.h:422:57: note: candidate: 'int32 BMessage::FindInt32(const char*, int32) const' (near match)
>   422 |                         int32                           FindInt32(const char* name, int32 n = 0) const;
>       |                                                         ^~~~~~~~~
> /boot/system/develop/headers/os/app/Message.h:422:57: note:   conversion of argument 2 would be ill-formed:
> Interface/TrayIcon.cpp:108:58: warning: invalid conversion from 'int*' to 'int32' {aka 'long int'} [-fpermissive]
>   108 |         Window()->CurrentMessage()->FindInt32("buttons", (int*)&mouseButtons);
>       |                                                          ^~~~~~~~~~~~~~~~~~~
>       |                                                          |
>       |                                                          int*
> /boot/system/develop/etc/makefile-engine:291: recipe for target 'objects.x86-cc13-release/TrayIcon.o' failed
> make: *** [objects.x86-cc13-release/TrayIcon.o] Error 1
> [x86] ~/compilar/beaim>

I got it to build on Beta5 x86_64 however, it is giving me an invalid screen name error.

Looking under Setup, it shows a different user and password grayed ou

1 Like

Did you register on iwarg.ddns.net?

1 Like

Oh,I must admit that I never tried it on 32bit,but that looks like a problem that I might have caused by fixing the compiler warnings on 64bit.
It seems that int32 is called ā€œlong intā€ in your error log.
On 64bit,the long int type is int64,so I removed all the "long"s since it were normal ints for me (int = int32 on 64bit).
I will have a look at fixing this for 32bit without breaking 64bit again later,thanks for the detailled log.

1 Like

Invalid screenname most likely means that you mistyped your name,or as @coolcoder613 said,you need to register first.
The user and password shown under Setup are irrelevant for this.
They belong to the proxy settings and are only used together with a HTTP or SOCKS5 proxy that requires authentification,therefore theyā€™re grayed out when Proxy Server is set to None (the default).
Also note that at least the SOCKS5 Proxy support is broken currently,so better keep the Proxy set to None for now.

What a coincidence, Iā€™m the host of that server, I tried debugging BeAIM on haiku several years ago, I ran into some peculiar issues with its handling of parsing the contact list before my development machine died.

1 Like

This is now fixed,building and running on 32bit does now work.
Surprisingly that error happened only on a single position,so it was easy to fix.
32bit still throws some warnings when using -Wall,but thatā€™s not so important for now,it works and Iā€™ll work on the remaining warnings when I have more free time.

2 Likes

I saw something related to the contact list in the release notes.
Looks like getting the contact list from the server works,but changing the order is only stored locally since thatā€™s complicated to synchronize,or something like that.
Thatā€™s of course one of the things Iā€™d like to improve some day.

https://phoenixim.ddns.net/ is the better url for web access, itā€™s got an https certificate

1 Like

A lot of stuff was stored locally, especially in early AIM versions, in versions prior to AIM 4 even the contact list was stored locally. OSCAR was a lean protocol and it kept the data transfer sizes as small as possible.

A lean protocol and small transfer sizes are a good thing.
Thatā€™s one part of what makes AIM so interesting for me.
My plan is to make the best possible use of what the protocol supports (feature parity with the Windows client would be cool),but still keep the application rather lightweight.

my server also supports an end-to-end encryption for encrypted messaging, since you-know-who sees fit these days to spy on everything people are doing. it only works with our in-house AIM clone but maybe we can shoe-horn it into BeAIM as well.

1 Like

Thatā€™s good to know and definitely interesting to also support some day.
My plan was to first support TLS-encrypted connections since thatā€™s something the official AIM client also supports,and itā€™s probably easier since existing libraries like OpenSSL can be used.
Unfortunately,your server doesnā€™t support TLS-encryption yet (as least the compatibility page tells to disable it in various clients),but maybe it can be added some day?

When implementing end-to-end encryption,I want to make sure not to break compatibility with other servers that strictly follow the OSCAR-specification without additions,and I want to make sure that chatting with users that have clients without end-to-end encryption support still works.
I think that should be possible without many problems,if done right.
Implementing a E2EE algorithm wonā€™t be as easy as TLS,however,so thatā€™s one of the things Iā€™ll do later when other,easier tasks are done.
What do you use for your end-to-end encryption?

beaim_lang-cocobean

  • Languages

Time to add it to the translation machineā€¦if not alreadyā€¦

All the OSCAR documentation we had access to for building the server was for AIM5 and older, the absolute newest to work is 6.1 which can still use the BUCP 5190 login, everything newer than that uses TLS through a new system called ClientLogin which we still havent been able to solve. there are still things in 6.0 we havenā€™t figured out, like 6 doesnā€™t use ICBM rendezvous SNACs for group chat invitations or direct connections.

1 Like

Translations do not yet use the Haiku LocaleKit but an own implementation with a different file format.
I want to change it to use the LocaleKit,then it will also automatically use the system language instead of requiring its own setting.
After that is done,Iā€™ll look into making translations easier.
For now,you can create a Pull Request on Codeberg that adds a new language file,or you can simply send me a new language file by email if you donā€™t have/want a Codeberg account.

Thanks for the detailed information on this :+1:
I somehow didnā€™t expect the documentation to be that much out of date,but well,last updated in 2005ā€¦Changes list
Letā€™s see what I can add to BeAIM with the existing documentation first.