Obviously right now you can't accept any other coins than ETH or ERC20 coins natively in a smart contract. What I'd do is:
create a struct in your contract to hold other coins, for example:
struct ExternalCoin {
string symbol;
uint amount;
}
create a global variable that can look like this:
mapping (address => Distributor) public externalCoins
create a function that can update the above variable, only if it's called by the contract owner
receive the external coins in external wallets
create an app that detects when a new payment arrived
make the above app update the externalCoins data
Update based on the comment
Assuming you wish to receive bitcoins (who wouldn't, lol) for your token, you can do the following:
- install a local running bitcoin node and interact with it through its json-rpc interface from your preferred language
- generate an address for each of your buyers using the getnewaddress API endpoint
- periodically run a script that monitors all the generated addresses for incoming payments using the listunspent API endpoint
- store the transaction id of the payment in a DB or some other way and only credit your buyer's accounts for the transactions that are not already credited
Given how many BTC forks are out there, the same workflow (with the exact same API calls) should work for at least several other coins: Bitcoin Cash, Litecoin, Dash, Monero, Zcash and most probably Bitcoin Gold.